Только в строках с определенной строкой заменить другую строку

Сценарий оболочки, чтобы найти вхождения слова «здесь» и только в тех строках, заменить слово «это» словом «это». Остальные все остальные строки печатаются как были.

-1
задан 27 November 2017 в 23:19

2 ответа

Предполагая, что у вас есть 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 для получения дополнительной информации.

6
ответ дан 27 November 2017 в 23:19

Решение 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 - распечатать текущую обработанную строку
1
ответ дан 27 November 2017 в 23:19

Другие вопросы по тегам:

Похожие вопросы: