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

时间:2011-11-15 19:15:31

标签: linux unix sed awk vi

我找不到合适的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如何做到这一点,因为我相信它是可能的! 但是,如果它可以通过另一种方式完成,那么只要它在命令行上就可以运行多个文件,我也很高兴。

非常感谢。

8 个答案:

答案 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\ng选项,对于全局,在这里很重要,因为它要求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