Кто-нибудь писал скрипт на sh , чтобы он начиная с определенной директории
просматривал все файлы по маске и заменял там одно выражение на другое ???
Ну, короче, replace-р такой .
Если есть возможность, приведите, пожалуйста текст .
Спасибо .
>Кто-нибудь писал скрипт на sh , чтобы он начиная с определенной директории
>
>просматривал все файлы по маске и заменял там одно выражение на другое
>???
>Ну, короче, replace-р такой .
>Если есть возможность, приведите, пожалуйста текст .
>Спасибо .
for i in `find DIRECTORY | grep ".txt$"`;do
tmpF=$i"_tmpZ"
cat $i | perl -ne "s/first/second/;print;' > $tmpF
mv -f $tmpF $i
done- но надо быть осторожным!!!
for i in `find DIRECTORY | grep ".txt$"`;do
tmpF=$i"_tmpZ"
cat $i | perl -ne "s/first/second/;print;' > $tmpF
mv -f $tmpF $i
doneЯ так понял :
DIRECTORY - начальная директория для поиска
.txt - маска файла
first/second - что искать/на что заменятьПравильно ???
Кстати, тут без перла не обошлось...
А просто на шелле можно ???И почему надо быть осторожным ???
>for i in `find DIRECTORY | grep ".txt$"`;do
>tmpF=$i"_tmpZ"
>cat $i | perl -ne "s/first/second/;print;' > $tmpF
>mv -f $tmpF $i
>done
>
>Я так понял :
>
>DIRECTORY - начальная директория для поиска
>.txt - маска файла
>first/second - что искать/на что заменять
>
>Правильно ???
ДА
>Кстати, тут без перла не обошлось...
>А просто на шелле можно ???
можно пользовать sed или awk (я не помню синтаксис см.man sed | awk), или perl - у него возможностей больше - можно "навароченные regexp'ы использовать. Сам shell - это всего лишь оболочка из которой вызываются сторонние програмки
>
>И почему надо быть осторожным ???
Сначала закоментируй строчку mv -f - посмотри на результат во временных файлах - если устраивает - раскомментируй (но в любом случае создай архив из изначальных файлов
tar -czvf original.tgz `find DIRECTORY | grep "[.]txt$" `
Понятно, но про шелл я имел в виду следующее :
Как я из логов апача ip выцепляю -cut -f1 -d' ' /usr/local/apache/logs/access_log | sort | uniq -c | sort -r > /usr/local/apache/htdocs/stat/ip.txt
Думал, можно и замену проделать в том же духе...
Посидел я тут и придумал такую штуку.
Система FeeBSD.
Ставим из портов /usr/ports/textproc/replaceit - заменяет в файле
что-то на что-то.
А дальше, как мне советовали (ну, почти) :Содержимое файла replace.sh :
for i in `find $1 | grep "$2$"`;do
cp $i $i.bak
/usr/ports/textproc/replaceit/work/replaceit-1.0.0/replaceit --input=$i "$3" "$4"
doneИспользование :
./replace.sh directory-to-parse file-mask what with-what
У меня работает !