Найти и заменить подстановочный знак, который охватывает строки?

Я хотел бы ввести такой текст:

foo
stuff
various stuff
could be anything here
variable number of lines
bar
Stuff I want to keep
More stuff I want to Keep
These line breaks are important

и получить это:

 foo
 teststuff
 bar
 Stuff I want to keep
 More stuff I want to Keep
 These line breaks are important

До сих пор я читал и возился с использованием sed, grep и pcregrep и не смог заставить его работать. Похоже, я мог бы сделать такое с Vim, но я никогда не использовал Vim раньше, и это похоже на королевскую боль.

Материал, который я пробовал, включает в себя:

sed -e s/foo.*bar/teststuff/g -i file.txt

а также

pcregrep -M 'foo\s+bar\s' file.txt | xargs sed 's/foo.*bar/teststuff/g'

Я не уверен, что я просто неправильно использую эти команды или использую не тот инструмент. Мне трудно поверить, что нет никакого способа использовать терминал для поиска и замены подстановочных знаков, которые охватывают строки.

3 ответа

Решение

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

$ awk 'f&&/bar/{print "teststuff";f=0} !f; /foo/{f=1}' file
foo
teststuff
bar
Stuff I want to keep
More stuff I want to Keep
These line breaks are important

Попробуйте это с помощью GNU sed:

sed -e '/^foo/,/^bar/{/^foo/b;/^bar/{i teststuff' -e 'b};d}'

Увидеть: man sed

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

sed '/foo/,/bar/cteststuff' file

Это заменит все между foo а также bar с teststuff,

Однако то, что вы, кажется, хотите, это все, что следует foo до barвозможно

sed '/foo/,/bar/cfoo\nteststuff\nbar' file
Другие вопросы по тегам