查找并替换跨行的通配符?
Find and replace wildcard that spans across lines?
我想输入这样的文字:
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'
我不确定是我没有正确使用这些命令,还是我使用了错误的工具。我很难相信没有办法使用终端来查找和替换跨行的通配符。
用 GNU sed 试试这个:
sed -e '/^foo/,/^bar/{/^foo/b;/^bar/{i teststuff' -e 'b};d}'
参见:man sed
为了清晰、简单、健壮、可维护、可移植和软件的大多数其他理想品质,只需使用 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 '/foo/,/bar/cteststuff' file
这会将 foo
和 bar
之间的所有内容替换为 teststuff
。
然而,您似乎想要的是 bar
之前 foo
之后的所有内容,也许:
sed '/foo/,/bar/cfoo\nteststuff\nbar' file
我想输入这样的文字:
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'
我不确定是我没有正确使用这些命令,还是我使用了错误的工具。我很难相信没有办法使用终端来查找和替换跨行的通配符。
用 GNU sed 试试这个:
sed -e '/^foo/,/^bar/{/^foo/b;/^bar/{i teststuff' -e 'b};d}'
参见:man sed
为了清晰、简单、健壮、可维护、可移植和软件的大多数其他理想品质,只需使用 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 '/foo/,/bar/cteststuff' file
这会将 foo
和 bar
之间的所有内容替换为 teststuff
。
然而,您似乎想要的是 bar
之前 foo
之后的所有内容,也许:
sed '/foo/,/bar/cfoo\nteststuff\nbar' file