Хотя я понятия не имею, почему вы не хотите использовать sed -i
, который делает именно то, что вам нужно, другой вариант будет perl
:
$ perl -pe 's/foo/bar/g if /b*z/' food.txt
mangoes|foo|faa
oranges|foo|faa
chocolates|bar|baz
-pe
означает «печатать каждую строку входного файла после применения к нему скрипта.
И вы можете использовать -i
, чтобы отредактировать файл на месте:
perl -i -pe 's/foo/bar/g if /b*z/' food.txt
Также обратите внимание, что регулярное выражение b * z
означает «соответствие 0 или более b
, за которым следует z
. Здесь он будет работать, потому что b * z
соответствует bar
, игнорируя b
и a
и просто сопоставляя z
. Другими словами, он будет соответствовать любому z
, поскольку любой z
будет примером 0 b
, за которым следует z
. Я думаю, что вы, вероятно, имеете в виду использовать b.* z (ab, за которыми следуют 0 или более символов, а затем az):
perl -i -pe 's/foo/bar/g if /b.*z/' food.txt