首先,这不是重复的,例如,如何使用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'
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 ...
–始终在输入中添加一个换行符。