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

如何在sed中用字符串替换换行符,sed,Sed,首先,这不是重复的,例如 我想要的是准确地替换字符串中的每个换行符(\n),例如: printf“%s”$“| sed”。。。;s/\n/\\&/g'应给出: a\ 空字符串 printf'%s'$'a'| sed'。。。;s/\n/\\&/g'应给出: a\ a(后面没有换行符) printf'%s'$'a\n'| sed'。。。;s/\n/\\&/g'应给出: a\ (最后一行的尾随\n也应更换) 像这样的解决方案:A;N、 美元!文学士;另一个问题中的s/\n/\\&/g不能正

首先,这不是重复的,例如

我想要的是准确地替换字符串中的每个换行符(
\n
),例如:

printf“%s”$“| sed”。。。;s/\n/\\&/g'
应给出:

a\

空字符串

printf'%s'$'a'| sed'。。。;s/\n/\\&/g'
应给出:

a\

a
(后面没有换行符)

printf'%s'$'a\n'| sed'。。。;s/\n/\\&/g'
应给出:

a\

(最后一行的尾随\n也应更换)

这样的解决方案:A;N、 美元!文学士;另一个问题中的s/\n/\\&/g
不能正确执行此操作:

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

工作

工作

但是当最后一行有尾随的
\n

printf '%s' $'a\nb\n' | 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 '%s\n' a   | perl -pe 's/\n/\\\n/' # a\<newline>
printf '%s\n' a b | perl -pe 's/\n/\\\n/' # a\<newline>b\<newline>
# etc

而不是一次读取整个输入,而不是逐行读取,这样会更高效。

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

printf '%s'   ''  | perl -pe 's/\n/\\\n/' # Empty string
printf '%s'   a   | perl -pe 's/\n/\\\n/' # a
printf '%s\n' a   | perl -pe 's/\n/\\\n/' # a\<newline>
printf '%s\n' a b | perl -pe 's/\n/\\\n/' # a\<newline>b\<newline>
# etc
而不是一次读取整个输入,而不是逐行读取,这样会更有效

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

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

aa无论如何,将GNU sed与
sed-z一起使用:

sed -z 's/\n/\\\n/g'
如何在sed中用字符串替换换行符

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

aa无论如何,将GNU sed与
sed-z一起使用:

sed -z 's/\n/\\\n/g'

GNU awk可以使用
RT
变量检测丢失的记录终止符:

gawk '{ORS=(RT?"\\":"") RT} 1'
这会在每个记录终止符之前添加一个“\”

使用GNU头的黑客:

{ printf 'a\nb\n'; printf '\n'; } | sed 's/$/\\/' | head -c-2
{ printf 'a\nb'; printf '\n'; } | sed 's/$/\\/' | head -c-2

向任何输入添加换行符。在每行末尾添加“\”。删除最后两个字节。

GNU awk可以使用
RT
变量检测丢失的记录终止符:

gawk '{ORS=(RT?"\\":"") RT} 1'
这会在每个记录终止符之前添加一个“\”

使用GNU头的黑客:

{ printf 'a\nb\n'; printf '\n'; } | sed 's/$/\\/' | head -c-2
{ printf 'a\nb'; printf '\n'; } | sed 's/$/\\/' | head -c-2

向任何输入添加换行符。在每行末尾添加“\”。删除最后两个字节。

您的上一个非工作示例只是上一个工作示例的副本,顺便说一句。
但是如果有尾随的
,则所示示例中没有尾随的换行符。@Shawn确实。。。复制粘贴错误。我已经改正了。也许从另一个角度来看这个问题。使用gnused
sed:a;N、 美元!文学士;s/$/\\\/mg'文件
?您在评论中提到希望保持POSIX兼容,但除了最后一个示例外,您的
printf
示例都不会产生POSIX兼容的输出,因为它们没有终止换行符,所以您要求sed的是POSIX未定义的行为。您的最后一个非工作示例只是上一个示例的副本工作一个,顺便说一句。
但是当有尾随的时候,在给出的例子中没有尾随的换行符。@Shawn确实。。。复制粘贴错误。我已经改正了。也许从另一个角度来看这个问题。使用gnused
sed:a;N、 美元!文学士;s/$/\\\/mg'文件
?您在评论中提到希望保持POSIX兼容,但除了最后一个示例外,您的
printf
示例都不会产生POSIX兼容的输出,因为它们没有终止换行符,所以您要求sed的行为不是POSIX定义的。谢谢。我发现这对我自己来说是可行的。只是想避开另一个叉子,用sed来完成这一切。但似乎(至少根据)sed根本不可能做到这一点。谢谢。我发现这对我自己来说是可行的。只是想避开另一个叉子,用sed来完成这一切。但似乎(至少根据)sed根本不可能做到这一点。谢谢。我已经有点怀疑这对sed根本不起作用,但只是不完全确定。原则上我希望保持POSIX兼容,所以-z是我宁愿避免的东西。但是使用上面的perl建议很好。谢谢。我已经有点怀疑这对sed根本不起作用,但只是不完全确定。原则上我希望保持POSIX兼容,所以-z是我宁愿避免的东西。但是使用上面的perl建议可以很好地工作。