Hot将sed中的换行符替换为字符串



首先,这不是重复的,例如,如何使用sed将每个换行符(\n(替换为空格?

我想要的是精确地替换字符串中的每一个换行符(n(,如下所示:

  • printf '%s' $'' | sed '...; s/n/\&/g'
    

    应导致空字符串

  • printf '%s' $'a' | sed '...; s/n/\&/g'
    

    应导致a(后面不跟换行(

  • printf '%s' $'an' | sed '...; s/n/\&/g'
    

    应导致

    a
    

    (最后一行的尾部n也应该被替换(

另一个问题中的:a;N;$!ba; s/n/\&/g这样的解决方案不能正确地做到这一点:

printf '%s' $'' | sed ':a;N;$!ba; s/n/\&/g' | hd

作品;

printf '%s' $'a' | sed ':a;N;$!ba;s/n/\&/g' | hd
00000000  61                                                |a|
00000001

作品;

printf '%s' $'anb' | sed ':a;N;$!ba;s/n/\&/g' | hd
00000000  61 5c 0a 62                                       |a.b|
00000004

作品;

当最后一行上有一个尾随n

printf '%s' $'anbn' | sed ':a;N;$!ba;s/n/\&/g' | hd
00000000  61 5c 0a 62 0a                                    |a.b.|
00000005

它没有被引用。

使用perl比使用sed更容易,因为它(至少在默认情况下(对输入中的换行符有更直接的处理:

printf '%s'   ''  | perl -pe 's/n/\n/' # Empty string
printf '%s'   a   | perl -pe 's/n/\n/' # a
printf '%sn' a   | perl -pe 's/n/\n/' # a<newline>
printf '%sn' a b | perl -pe 's/n/\n/' # a<newline>b<newline>
# etc

如果你的投入不是很大,你可以使用

perl -0777 -pe 's/n/\n/g'

而是一次读取整个输入,而不是逐行读取,这可以更有效。

如何在sed 中用字符串替换换行符

这是不可能的。从sed脚本的角度来看,尾行缺失与否没有任何区别,并且无法检测。

Aaaanyway,将GNU sed与sed -z:一起使用

sed -z 's/n/\n/g'
GNU awk可以使用RT变量来检测丢失的记录终止符:
$ printf 'anbn' | gawk '{ORS=(RT != "" ? "\" : "") RT} 1' 
a
b
$ printf 'anb' | gawk '{ORS=(RT != "" ? "\" : "") RT} 1'
a
b$ 

这增加了一个"\"在每个非空记录终止符之前。

使用任何awk:

$ printf 'anbnn' | awk '{printf "%s%s", sep, $0; sep="\n"}'
a
b
$ printf 'anbn' | awk '{printf "%s%s", sep, $0; sep="\n"}'
a
b$ 

或者{ cat file; echo; } | awk ...–始终在输入中添加一个换行符。

最新更新