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如何做到这一点,因为我相信它是可能的!但是,如果它可以通过另一种方式完成,那么只要它在命令行上,我也很高兴,因为它必须运行在许多文件上.
非常感谢.
这应该做的伎俩:
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不要在第一个匹配模式停止.
对于实际换行,请使用:
sed -e ':a; /mark$/ { N; s/mark\n//; ba; }'
Run Code Online (Sandbox Code Playgroud)
所有以mark结尾的行都与下一行连接,现在中间的\n被删除.
如果\n
行末尾有一个文字字符串,则需要转义\
as \\n
.