在 bash 脚本中将 \n 保留为纯文本而不是换行符

在 bash 脚本中将 \n 保留为纯文本而不是换行符

我有一个包含多行的现有文本文件。我正在尝试构建一个 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没有什么区别。

相关内容