0

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

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'

我不确定是我没有正确使用这些命令,还是我使用了错误的工具。我很难相信没有办法使用终端来查找和替换跨行的通配符。

4

3 回答 3

1

用 GNU sed 试试这个:

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

看:man sed

于 2015-08-23T07:52:56.223 回答
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
于 2015-08-23T18:53:38.237 回答
0

这可能对您有用(GNU sed):

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

这将替换foo和之间bar的所有内容teststuff

但是,您似乎想要的是foobefore 之后的所有内容bar,也许:

sed '/foo/,/bar/cfoo\nteststuff\nbar' file
于 2015-08-24T07:04:43.190 回答