我正在尝试替换(用sed
)包含特定单词的整行和末尾的换行符。这里是测试文件:
this # target for substitution
this is a test
another test?
现在,我已经发布在这里,并从链接的帖子,我明白如何以某种方式做到这一点:
sed 's/^this$/test/g' testfile
这有效,或者至少看起来是这样,因为单词末尾的换行符this
仍然存在:
test # target for substitution but newline is still there
this is a test
another test?
鉴于上述情况,我也完全意识到的 sed
无法直接匹配换行符(虽然我记得我可以在某些版本的 中使用 '\n' sed
,但这不是重点)。
我确实知道如何至少删除整个单词/行和换行符:
sed '/^this$/d' testfile
但我需要用它来代替。
我怎样才能做到这一点? (sed
最好)
答案1
据我了解,您想将仅由单词this
和后面的换行符组成的行替换为test
,所以
foo
this
this is a test
应该成为
foo
testthis is a test
您sed
只需将下一行加入N
并替换到换行符之前的所有内容:
sed '/^this$/{N;s/.*\n/test/;}'
答案2
我建议在这里使用,语法与本例perl
没有什么不同:sed
$ cat ip.txt
this
this is a test
another test?
$ perl -pe 's/^this\n/XYZ/' ip.txt
XYZthis is a test
another test?
答案3
使用 GNU sed,您可以将所有行读入内存-z
并从那里进行匹配,例如:
sed -z 's/this\n/test/'
答案4
使用 awk 的一种方法是通过操作输出记录分隔符:
$ awk '{ ORS = sub(/^this$/,"FOO") ? "" : RS }1' file
$ sed -e '
$!N
s/^this\n/FOO/;t
P;D
' file