我有一个文件名test.sh,我希望将每个\n
和\t
转义符替换为它们的实际换行符和制表符。
cat test.sh
Maria\nJimenez
Jose\tBaez
Lindo\nGarcia
Luis\tOvalle
Placido\nRuiz
结果输出应该是这样的:
Maria
Jimenez
Jose Baez
Lindo
Garcia
Luis Ovalle
Placido
Ruiz
我尝试了以下命令:
awk '{gsub(/\\n/,"\n")}1' | awk '{gsub(/\\t/,"\t")}1' test.sh
但它并不能同时取代两者。只用一个命令我可以完成这个任务吗?
如果解决方案涉及使用sed,perl,tr或任何其他方法,则无关紧要。
答案 0 :(得分:1)
sed -i -e 's|\\n|\n|g' -e 's|\\t|\t|g' test.sh
Sed可以在一个命令中执行多个脚本
s # substitute
| # open capture block
\\n # match literal '\n' instead of the newline character
| # close capture block, open replacement block
\n # replace with newline character
| # close replacement block
g # match multiple times per line
-i
编辑文件inplace
-e
标记要执行的脚本
答案 1 :(得分:1)
printf '%b
可以解释转义序列,因此您只需将文件内容提供给printf
命令:
printf '%b\n' "$(<file)"
Maria
Jimenez
Jose Baez
Lindo
Garcia
Luis Ovalle
Placido
Ruiz
要在文件使用中保存输出:
printf '%b\n' "$(<file)" > file
%b
扩展了所有反斜杠转义序列,不只是\t
或\n
。例如,它还会展开\f
(换页)或\r
(回车)。查看help printf
或help echo
了解详情。
答案 2 :(得分:1)
问题同时可以从字面上理解(虽然没有一个答案那样做)或解释为在一个过程中。
awk可以很好地完成后者,因为它可以连续执行多个gsub
:
cat test.sh | awk '{gsub(/\\n/,"\n"); gsub(/\\t/,"\t"); print;}'
但是(如果按字面意思解决问题), awk
无法在单个gsub
调用中执行此操作。您可能可以使用 perl
,但肯定不会在sed
等中
答案 3 :(得分:0)
您可以在PERL的命令行中使用条件,如下所示:
perl -pi -w -e 's~(?:(?<NEWLINE>\\n)|(?<TAB>\\t))~$+{NEWLINE}?"\n":"\t"~egi' file_name.txt
这里发生的一切是,它正在尝试匹配\\n
或\\t
,并通过在其前添加?<NEWLINE>
或?<TAB>
来为其指定名称。
接下来,它会检查命名组<NEWLINE>
是否与此匹配:
$+{NEWLINE}?
如果是这样,那么它将用换行符替换它。
"\n"
否则:
,它会用标签替换它。
"\t"