我找不到合适的sed表达式来删除单词后跟换行符(\ n)
测试文件是:
line1\n
line2\n
line3mark\n
line4\n
line5\n
我希望删除所有出现的标记\ n离开,在这种情况下:
line1\n
line2\n
line3line4\n
line5\n
已搜索并可以使用:
sed 's/\n//g' test.file to remove ALL \n's
但
sed 's/mark\n//g' test.file does not work
奇怪的是,s / mark \ n // g在交互模式下似乎在vi中正常工作。
任何帮助非常感谢! 我想了解如何使用SED如何做到这一点,因为我相信它是可能的! 但是,如果它可以通过另一种方式完成,那么只要它在命令行上就可以运行多个文件,我也很高兴。
非常感谢。
答案 0 :(得分:6)
对于实际换行,请使用:
sed -e ':a; /mark$/ { N; s/mark\n//; ba; }'
所有以mark结尾的行都与下一行结合,现在中间的\ n被删除。
如果该行末尾有一个文字字符串\n
,则需要将\
转义为\\n
。
答案 1 :(得分:5)
这应该可以解决问题:
sed -i ':a;N;$!ba;s/mark\n//g' file
说明:
; 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
像这样继续进行。它读取模式空间中的标准输入,在模式空间上执行一系列编辑命令,然后将模式空间写入STDOUT。
当您执行类似
的操作时sed -i 's/mark\n//' file
将行逐个复制到模式空间。
:a;N;$!ba
将每一行附加到模式空间。
然后可以一次处理模式空间,删除任何mark\n
,g
选项,对于全局,在这里很重要,因为它要求sed不要停留在第一个匹配模式。< / p>
答案 2 :(得分:2)
我看到了awk
标签,所以我们走了。
如果\n
是'换行',则awk可以加入以下一行'mark'结尾的行。
$> awk '/mark$/ { sub(/mark$/,""); getline t; print $0 t; next }; 1' ./text
line1
line2
line3line4
line5
答案 3 :(得分:1)
如果你可以使用awk,你可以
awk '
/mark$/ {sub(/mark$/, ""); hold = hold $0; next}
{print hold $0; hold = ""}
END {if (hold) print hold}
'
答案 4 :(得分:1)
已经有很多答案,sed和awk。
我用awk添加另一个,只是显示awk可以用更短的命令来完成:
awk 'gsub(/mark$/,""){printf $0;next;}1' input
试验:
kent$ echo "line1
line2
line3mark
line4
line5"|awk 'gsub(/mark$/,""){printf $0;next;}1'
输出:
line1
line2
line3line4
line5
不知道这是否真的是OP。
答案 5 :(得分:0)
只需使用以下命令
即可sed -e "{:q;N;s/mark\n//g;t q}" test.file
答案 6 :(得分:0)
这可能对您有用:
sed -e '1{h;d};H;${x;s/mark\n//g;p};d' test.file
答案 7 :(得分:0)
awk '{sub(/line4/,"line3line4")}!/mark/' file
line1\n
line2\n
line3line4\n
line5\n