我有一个包含多行的现有文本文件。我正在尝试构建一个 bash 脚本,将所有这些行连接成一行,并以\n(实际文本,而不是换行符)将其作为 JSON 文件中的字段传递以供 API 使用。
源文件:
abc=123
def=456
ghi=789
预期输出:
abc=123\ndef=456\nghi=789
我尝试过的所有方法要么是删除尾随的新行,要么是返回与源文件相同的输出。是否可以告诉脚本处理\n
纯文本而不是新行?非常感谢您的意见,因为我在网上找不到任何有用的信息。
答案1
以下是perl
该问题的一个简短解决方案
perl -e 'chomp(@a=<>); print join ("\\n", @a), "\n"'
你可以喂它标准输入或者在命令末尾提供文件
例子
( echo one; echo two; echo three ) |
perl -e 'chomp(@a=<>); print join ("\\n", @a), "\n"'
one\ntwo\nthree
该示例是内存受限的,因为它将读取其整个标准输入写入内存后再写出。如果您有一个非常大的文件,您可能更喜欢循环方法。读取输入的规则与上述相同。
perl -e 'while (<>) { print "\\n" if $a++; chomp; print }; print "\n"'
答案2
两个 sed 的动作可以帮助你。
$ cat file.txt
abc=123
def=456
ghi=789
sed -z 's/\n/\\n/g; s/..$//' file.txt
abc=123\ndef=456\nghi=789
首先将换行符更改为字符“\n”,然后删除字符串末尾的多余字符“\n”。
答案3
sed 's/$/\\n'
将\n
在每行末尾添加文字。然后您需要tr -d '\n'
删除实际的换行符。
如果输入文件的最后一行不是以换行符结尾,则sed
可能会也可能不会处理它。如果最后一行正确结束,那么我们sed
也会在那里添加\n
。您的示例表明您不想要\n
结尾;因此我们需要sed
稍微修改我们的命令。这两个命令合在一起将如下所示:
<input sed '$ ! s/$/\\n/' | tr -d '\n'
由于我们tr
删除了所有换行符,因此输出中不会有终止换行符。如果您想要一个,只需echo
在之后运行:
<input sed '$ ! s/$/\\n/' | tr -d '\n'; echo
如果您想捕获输出,$()
请注意它会删除所有尾随的换行符;所以在这种情况下,额外的echo
没有什么区别。