替换整行,同时删除该特定行的换行符

替换整行,同时删除该特定行的换行符

我正在尝试替换(用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

相关内容