Чтобы заменить «старый» на «новый» и «СТАРЫЙ» на «НОВЫЙ», просто скажите sed сделать и то, и другое:
for file in./*; do
cat "$file"
sed -i -e 's/old/new/g; s/OLD/NEW/g' "$file"
done
Не забудьте заключить переменные в кавычки, если у вас есть файл с именемsome filename
(с пробелами, символами новой строки или символами табуляции ). Я также добавил -i
, расширение GNU sed, учитывая, что вы указали, что можете использовать расширение флага GNU /i , чтобы указать sed редактировать файл в месте -вместо того, чтобы полагаться на tee
и буферы для этого.
Вы можете использовать perl:
$ cat file
old news
OLD news
old Old oLD news
older news
$ perl -pe 's{(old)}{ ($tmp = $1) =~ tr/OLDold/NEWnew/; $tmp }ieg' file
new news
NEW news
new New nEW news
newer news
Он использует оператор s///
для поиска и замены, а при замене он транслитерирует символы из «старых» в «новые», сохраняя регистр отдельных символов. Это работает только потому, что «старый» и «новый» имеют одинаковую длину строки.
Мне нужно использовать временную переменную, потому что $1
— это значение -, доступное только для чтения.
Учитывая, что строки имеют одинаковый размер, все эти команды будут работать:
<infile sed 'y/OLDold/NEWnew/' >outfile
<infile tr 'OLDold' 'NEWnew' >outfile
sed -i 'y/OLDold/NEWnew/' infile