查找并替换跨越行的通配符?

时间:2015-08-23 07:38:32

标签: sed grep wildcard line-breaks pcregrep

我想输入一些这样的文字:

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 个答案:

答案 0 :(得分:1)

尝试使用GNU sed:

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

请参阅:man sed

答案 1 :(得分:1)

为了清晰,简单,健壮,可维护性,可移植性以及大多数其他理想的软件质量,只需使用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

答案 2 :(得分:0)

这可能适合你(GNU sed):

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

这将用foo替换barteststuff之间的所有内容。

然而,您似乎想要的是foo bar之前的所有内容,可能是:

sed '/foo/,/bar/cfoo\nteststuff\nbar' file