如何将换行符转换为字面值" \ n"

时间:2016-09-21 20:59:59

标签: json sed literals linefeed

我在将文件转换为格式正确的json字符串时遇到问题。 多年来一直在摆弄sed,但它似乎嘲笑我。 如果重要的话,我正在研究RHEL 6。

我试图转换此文件(内容):

Hi there...

foo=bar
tomàto=tomáto
url=http://www.stackoverflow.com

进入这个json字符串:

{"text":"Hi there...\n\nfoo=bar\ntomàto=tomáto\nurl=http://www.stackoverflow.com"} 

如何替换文字中的实际换行符' \ n'字符??这就是我完全陷入困境的地方!

我一直在尝试将换行符转换为";"首先,然后回到文字" \ n"。为文件中的每一行尝试循环。不能让它发挥作用......

非常感谢一些帮助! 谢谢!

6 个答案:

答案 0 :(得分:1)

使用GNU sed:

sed ':a;N;s/\n/\\n/;ta' file | sed 's/.*/{"text":"&"}/'

输出:

{"text":"Hi there...\n\nfoo=bar\ntomàto=tomáto\nurl=http://www.stackoverflow.com"}

答案 1 :(得分:1)

sed用于单个行上的简单替换,即全部。由于sed逐行工作,你的sed脚本没有看到行结尾,所以你不能通过使用神秘的语言结构和复杂的逻辑来改变行结尾而不会跳过箍自从20世纪70年代中期发明awk以来就很有用。

这会将输入文件中的所有换行符更改为字符串\n

$ awk -v ORS='\\n' '1' file
Hi there...\n\nfoo=bar\ntomàto=tomáto\nurl=http://www.stackoverflow.com\n

这将完成剩下的工作:

$ awk -v ORS='\\n' 'BEGIN{printf "{\"text\":\""} 1; END{printf "\"}\n"}' file
{"text":"Hi there...\n\nfoo=bar\ntomàto=tomáto\nurl=http://www.stackoverflow.com\n"}

或者如果您在输入文件的末尾有换行但不希望它在输出中成为\n字符串:

$ awk -v ORS='\\n' '{rec = (NR>1 ? rec ORS : "") $0} END{printf "{\"text\":\"%s\"}\n", rec}' file
{"text":"Hi there...\n\nfoo=bar\ntomàto=tomáto\nurl=http://www.stackoverflow.com"}

答案 2 :(得分:0)

awk救援!

$ awk -vRS='\0' '{gsub("\n","\\n"); 
                  print "{\"text\":\"" $0 "\"}"}' file

{"text":"Hi there...\n\nfoo=bar\ntomàto=tomáto\nurl=http://www.stackoverflow.com\n"}

答案 3 :(得分:0)

使用awk

awk -v RS=^$ '{gsub(/\n/,"\\n");sub(/^/,"{\"text\":\"");sub(/\\n$/,"\"}")}1' file

<强>输出

{"text":"Hi there...\n\nfoo=bar\ntomàto=tomáto\nurl=http://www.stackoverflow.com"}

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed '1h;1!H;$!d;x;s/.*/"text":"&"/;s/\n/\\n/g' file

将文件拖入内存并使用模式匹配将文件操作为所需的格式。

答案 5 :(得分:0)

最简单(又优雅?)的解决方案:):

#!/bin/bash

in=$(perl -pe 's/\n/\\n/' $1)

cat<<EOF
{"text":"$in"} 
EOF

用法:

./script.sh file.txt

输出:

{"text":"Hi there...\n\nfoo=bar\ntomàto=tomáto\nurl=http://www.stackoverflow.com\n"}