【发布时间】:2012-11-16 15:11:07
【问题描述】:
我想使用tr 命令将所有出现的字符串“\n”替换为新行 (\n)。
我试过 tr '\\n' '\n' 但这似乎与任何 '\' 和任何 'n' 匹配
【问题讨论】:
-
正如@Aniket 指出的那样,
tr对此不起作用 - 它用单个字节替换单个字节并且不能处理多字节字符串(“\n”)。您需要sed、awk或其他工具来完成此操作。
我想使用tr 命令将所有出现的字符串“\n”替换为新行 (\n)。
我试过 tr '\\n' '\n' 但这似乎与任何 '\' 和任何 'n' 匹配
【问题讨论】:
tr 对此不起作用 - 它用单个字节替换单个字节并且不能处理多字节字符串(“\n”)。您需要sed、awk 或其他工具来完成此操作。
以下是使用sed 的方法:
sed 's/\\n/\n/g'
示例用法:
要就地替换文件中所有出现的\n:
sed -i 's/\\n/\n/g' input_filename
通过管道替换所有出现的\n,并保存到另一个文件中
cat file1 file2 file3 file4 | sed 's/\\n/\n/g' > output_file
【讨论】:
sed 才能工作。 brew install gnu-sed 然后使用gsed 命令或设置$PATH 以便GNU 版本优先:stackoverflow.com/a/34815955/3316036
sed 版本有区别。不幸的是,非便携版本被接受了。
Perl 解决方案类似于 sampson-chen 的 sed 解决方案:
perl -pe 's/\\n/\n/g'
示例:
带文字 \n 的输入文件(不是换行符):
$ cat test1.txt
foo\nbar\n\nbaz
用实际的换行符替换所有出现的\n,打印到STDOUT:
$ perl -pe 's/\\n/\n/g' test1.txt
foo
bar
baz
同样,原地更改输入文件,将备份保存到test1.txt.bak:
$ perl -i.bak -pe 's/\\n/\n/g' test1.txt
Perl 单行代码使用这些命令行标志:-e:告诉 Perl 查找内联代码,而不是在文件中。-p:循环输入一行一次,默认分配给$_。在每次循环迭代后添加print $_。-i.bak:就地编辑输入文件(覆盖输入文件)。在覆盖之前,保存原始文件的备份副本,方法是在其名称后附加扩展名 .bak。
另请参阅:perldoc perlrun: how to execute the Perl interpreter: command line switchesperldoc perlre: Perl regular expressions (regexes)
【讨论】:
我有一个类似的问题,我想在 Mac BigSur 上用新行替换 '\n'
输入:
-----BEGIN CERTIFICATE-----\\nMIGcz......\naLRn\\nyxiJdo=\\n-----END CERTIFICATE-----
预期输出:
-----BEGIN CERTIFICATE-----
MIGcz......
aLRn
yxiJdo=
-----END CERTIFICATE-----
Sed,perl 都不适合我。但是一个简单的“tr”命令很有用。
echo -----BEGIN CERTIFICATE-----\\nMIGcz......\\naLRn\\nyxiJdo=\\n-----END CERTIFICATE----- | tr '\' '\n'
【讨论】:
\ ,并留下n。