如何使用一个命令分别用新行和制表符替换\ n和\ t?

时间:2017-03-03 18:09:00

标签: regex linux unix awk

我有一个文件名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或任何其他方法,则无关紧要。

4 个答案:

答案 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 printfhelp 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"