Сценарий оболочки, чтобы найти вхождения слова «здесь» и только в тех строках, заменить слово «это» словом «это». Остальные все остальные строки печатаются как были.
Предполагая, что у вас есть file.txt
, содержащее эти две строки:
here is this
but not this
Вы можете выполнить следующую команду sed
, чтобы заменить «this» на «that» во всех строках, содержащих слово «here» , оставляя все остальные строки нетронутыми:
sed '/\bhere\b/ s/\bthis\b/that/g' file.txt
Обратите внимание, что \b
в шаблонах символизирует границы слова, то есть начало или конец слова. Без них, например «там» также будет соответствовать.
Вывод:
here is that
but not this
Прочитайте man sed
для получения дополнительной информации.
Решение awk
(то есть GNU Awk
в Ubuntu) может выглядеть следующим образом:
awk '{ if ( /\yhere\y/ ) gsub ( /\ythis\y/ , "that" ); print }'
\y
в awk
равно \b
в sed
, важность которого здесь @ByteCommander уже объяснил . Сравните этот пример:
$ awk '{if(/here/)gsub(/\ythis\y/,"that");print}' <<EOL
> here is this
> here is athis
> there is this
> EOL
here is that
here is athis
there is that
$ awk '{if(/\yhere\y/)gsub(/\ythis\y/,"that");print}' <<EOL
> here is this
> here is athis
> there is this
> EOL
here is that
here is athis
there is this
if ( conditional expression ) action
- awk
if
: если текущая обработанная строка содержит условное выражение ], затем выполните действие /\yhere\y/
- регулярное выражение, соответствующее слову «здесь» gsub(x,y)
- g
лобально (= несколько раз на строку, если необходимо) sub
stitute x
by y
print
- распечатать текущую обработанную строку