sed добавляет после строки, содержащей несколько неупорядоченных строк

sed добавляет после строки, содержащей несколько неупорядоченных строк

Я пытаюсь использовать sed для добавления appendstringпосле строки, содержащей Helloи World.

Hello something here World
World fsf Hello

Это работает, если я учитываю порядок:

sed -i '/Hello*World\|World*Hello/a appendstring' file

Но если мне нужно сопоставить много строк, и они не упорядочены, то это определенно неэффективно.

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

https://stackoverflow.com/questions/28561519/удалить-строки-содержащие-две-строки

Однако,

sed -i '/Hello/!b;/World/d' file

Это даже не работает для удаления.

Следующий ответ также является одним из ответов на этот вопрос:

sed -i '/Hello/{/World/d}' file

работает,поэтому я попытался реализовать его для добавления. Используя:

sed -i '/Hello/{/World/a} appendstring' file

Но получена ошибка:

sed: -e expression #1, char 0: unmatched `{'

Обновлять: В посте по ссылке указано решение с !b, и оно не работало в cshell из-за знака exlamation, но работает в sh и bash. И его также можно легко расширить для вставки многих строк при запуске sed внутри скрипта и добавления большого абзаца.

sed -i '/Hello/!b; /World/a \
addline \
addanotherline ' file

решение1

У вас почти получилось:

sed -i '/Hello/{/World/a} appendstring' file

Вам нужно разделить ваши аргументы. Используйте -e, например, так:

sed -i -e '/Hello/{/World/a appendstring' -e '}' file

Обратите внимание, что использованиеаКоманда ppend без символа новой строки является расширением GNU, как и -iпереключатель.


Чтобы сделать это более переносимым, а также учитывая возможность сопоставления нескольких строк, попробуйте:

sed '/multiple/{/words/{/to/{/match/ s/$/append this/;};};}' file > newfile
mv newfile file

Поскольку вы уже используете GNU Sed, просто используйте:

sed -i -e '/multiple/{/words/{/to/{/match/ a append this' -e 'a and also this' -e 'a oh and this too' -e '};};}' file

Связанный контент