我有一个包含换行符的字符串。我想通过用两个字符的字符串替换所有换行符来转义该字符串中的所有换行符:“\n”。我怎样才能在 POSIX sh 中做到这一点?
这是目标:
$ printf 'a\nb\nc\nd' | escape_newlines | od -a
0000000 a \ n b \ n c \ n d
141 134 156 142 134 156 143 134 156 144
0000012
我该如何定义escape_newlines
?
我尝试过的方法:
tr
— 问题:无法将单个字符转换为多个字符。awk 'BEGIN{ORS="\\n"} {print}'
— 问题:即使字符串不以换行符结尾,也始终在字符串末尾插入两个字符的字符串“\n”。例子:$ printf 'hi\n' | awk 'BEGIN{ORS="\\n"} {print}' | od -ab 0000000 h i \ n 150 151 134 156 0000004 $ printf 'hi' | awk 'BEGIN{ORS="\\n"} {print}' | od -ab 0000000 h i \ n 150 151 134 156 0000004
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g'
— 问题:如果字符串末尾有换行符,则不会被转换。例子:$ printf 'h\ni' | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g' | od -ab 0000000 h \ n i 150 134 156 151 0000004 $ printf 'h\ni\n' | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/\\n/g' | od -ab 0000000 h \ n i nl 150 134 156 151 012 0000005