Posterous theme by Cory Watilo

Filed under: bash

Работа. Есть 2 файла, надо найти пересечение.

Сегодня возникла задача - есть 2 файла, нужно сравнить их и вывести только те строки которые есть и в первом, и во втором, т.е. пересечение.

Не долго думая, из-под руки вышло следующее:

diff -y new.lst old.lst | grep -Ev '>|<|\|' | perl -l12ane 'print $F[0]'
Ну не знаю, почему так получилось :)

UPD:  join new.lst old.lst
Original post http://sharifulin.livejournal.com/22309.html

Работа. Перевод проекта с cp1251 на utf8.

Обычная такая задача для любого разработчика - перевести проект с одной кодировки в другую.
Кроме того, что нужно перевести БД и научить скрипты работать с utf8-данными и отдавать их, нужно перевести все шаблоны и все исходники в UTF-8. Причем не просто с BOM-символом, а в UTF-8 Cookie  - в первых двух строчках должна быть кука - encoding="utf8" (кука зависит от настроек редактора, мне нравится такая :).
Для любителей рутины задача превосходная - открыл файл, добавил куку, сохранил как UTF-8 Cookie (так чтобы вся не латиница осталась корректной) и закрыл.
После того, как я перевел в ручную 2 файла, я устал (всего файлов несколько сотен).

Вот скрипт, который меня спас - написал за пол-часа:

#~ DIR=../tmpl/#~ ADD='encoding="utf-8"'DIR=../lib/ADD='encoding="utf-8"'find $DIR -type f | while read FILEdo        if [ ! -n "`cat $FILE | head -n2 | grep -i $ADD`" ]; then                echo $FILE                #~ perl -Mencoding=cp1251,STDOUT,utf8 -pe 1 <$FILE | perl -e "print qq{^[\`$ADD\`]\n}, <>;" | (rm $FILE; cat >$FILE)                perl -Mencoding=cp1251,STDOUT,utf8 -pe 1 <$FILE | perl -e "print do { chomp(\$_ = <>); /^#!/ ? \$_.' -CDSA' : \$_ }, qq{\nuse utf8; # $ADD\n}, <>;" | (rm $FILE; cat >$FILE)        fidone
 
С помощью первой части (та, что закомментирована) обошел все шаблоны и там где не было куки (кукой может являться атрибут encoding в <?xml ?>, если это xml-документ, поэтому пропускаем), добавил первой строкой ее в виде комментария шаблонизатора :) и поменял кодировку файла.
С помощью второй части (инвертирование комментарий) обошел все модули (а также тестирующие скрипты), произвел те же операции, только в качестве куки использовал Perl-прагму utf8 с необходимым комментарием, только это должна была быть вторая строка, а также ко всем скриптам добавил ключ запуска CDSA.

После чего, весь проект заработал в UTF-8.
Не сразу, конечно, в некоторых модулях первая и вторая строка была POD-документация и кука вставилась прямо в нее :)
После ручной коррекции, все заработало.


Original post http://sharifulin.livejournal.com/20563.html

Поиск файлов и замена содержимого на месте

Возникла потребность в написание скрипта, который для статичного сайта заменит одну строку на другую, причем таких правил может быть несколько.

Первая мысль - написать Perl-скрипт, который рекурсивно пройдется по дереву сайта, найдет все *.html файлы, применит к каждому ряд правил и сохранит.

Но я не ищy легких путей :)

Поэтому решил написать BASH-скрипт, используя утилиту find и конечно же сам perl.

Код:

#!/bin/bashfind . -regex '.*\.html' | while read FILEdo        echo $FILE        perl -pi - $FILE <<-'PERL'                # список правил                s{222}{333}g;        PERLdone
Получилось очень просто и со вкусом.
Спасибо [info]pavel_kudinov за идею использовать STDIN, вместо атрибута -e в perl.
Original post http://sharifulin.livejournal.com/1165.html