
Я пытаюсь использовать 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