Замените целые слова друг с другом в awk / sed - PullRequest
3 голосов
/ 15 апреля 2020

Допустим, у меня есть файл с таким содержимым:

hello
bye
bye
asd
hello

Я хотел бы обменять привет на пока и наоборот (это только пример поэтому, пожалуйста, не придерживайтесь этих слов).

Я пробовал с:

sed -e 's/hello/bye/I g;s/bye/hello/I g' input.txt > output.txt

, но, как вы можете себе представить, это изменило только пока на привет и привет остались без изменений.

Ответы [ 2 ]

4 голосов
/ 15 апреля 2020

С GNU sed:

sed '/^hello$/{ s/.*/bye/;b }; /^bye$/{ s/.*/hello/ }' file

b label: ответвление к этикетке; если метка опущена, переход к концу скрипта.

Вывод:

bye
hello
hello
asd
bye
0 голосов
/ 15 апреля 2020

Это может работать для вас (GNU sed):

sed -z 's/\<hello\>/\x00/ig;s/\<bye\>/hello/ig;s/\x00/bye/g' file

Используйте опцию -z, чтобы вылить файл в память.

Заменить каждый hello нулевым байтом .

Заменить каждый bye на hello.

Заменить каждый нулевой байт на bye.

NB. С опцией -z строки, принятые в пространство шаблона ограничено нулевыми байтами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...