Найти и заменить подстановочный знак, который охватывает строки?
Я хотел бы ввести такой текст:
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