SED - 删除字符串后跟LineFeed(\n)

use*_*271 9 unix linux vi awk sed

我找不到合适的sed表达式来删除一个单词后跟一行返回(\n)

测试文件是:

line1\n
line2\n
line3mark\n
line4\n
line5\n
Run Code Online (Sandbox Code Playgroud)

我希望删除所有出现的标记\n离开,在这种情况下:

line1\n
line2\n
line3line4\n
line5\n
Run Code Online (Sandbox Code Playgroud)

已搜索并可以使用:

sed 's/\n//g' test.file  to remove ALL \n's
Run Code Online (Sandbox Code Playgroud)

sed 's/mark\n//g' test.file does not work
Run Code Online (Sandbox Code Playgroud)

奇怪的是,s/mark \n // g在交互模式下似乎在vi中正常工作.

任何帮助非常感谢!我想了解如何使用SED如何做到这一点,因为我相信它是可能的!但是,如果它可以通过另一种方式完成,那么只要它在命令行上,我也很高兴,因为它必须运行在许多文件上.

非常感谢.

log*_*og0 7

这应该做的伎俩:

sed -i ':a;N;$!ba;s/mark\n//g' file
Run Code Online (Sandbox Code Playgroud)

说明:

;    command separator within sed
:a   a label, like in C/C++
N    appends the next line to the pattern space
$!ba repeats the N command for all lines but the last line
Run Code Online (Sandbox Code Playgroud)

sed像这样继续前进.它读取模式空间中的标准输入,在模式空间上执行一系列编辑命令,然后将模式空间写入STDOUT.

当你做类似的事情

sed -i 's/mark\n//' file
Run Code Online (Sandbox Code Playgroud)

线条逐个复制到图案空间.

:a;N;$!ba 将每一行附加到模式空间.

然后可以在一个过程中处理模式空间,删除任何一个mark\n,g全局的选项在这里很重要,因为它要求sed不要在第一个匹配模式停止.


thi*_*ton 6

对于实际换行,请使用:

sed -e ':a; /mark$/ { N; s/mark\n//; ba; }'
Run Code Online (Sandbox Code Playgroud)

所有以mark结尾的行都与下一行连接,现在中间的\n被删除.

如果\n行末尾有一个文字字符串,则需要转义\as \\n.


小智 0

只需使用以下命令

sed -e "{:q;N;s/mark\n//g;t q}" test.file
Run Code Online (Sandbox Code Playgroud)