替换unix中特定字段中的新行

时间:2016-09-21 20:15:59

标签: unix replace find

我在一个文件中有一个字段,其中包含" \ n"在价值之间。我想删除它们。我该怎么办?

例如,我的第4个字段可能包含一个或多个\ n。我想摆脱所有这些。

a|b|c|d\nD\n\n|e
a1|b1|c1|d1\n\nd2\n|e1

1 个答案:

答案 0 :(得分:1)

使用sed

将此作为您的测试文件:

$ cat file
a|b|c|d\nD\n\n|e
a1|b1|c1|d1\n\nd2\n|e1

\n可以删除如下:

$ sed 's|\\n||g' file
a|b|c|dD|e
a1|b1|c1|d1d2|e1

或者,要更改文件:

sed -i.bak 's|\\n||g' file

这使用单个替换命令。替换命令的格式为s|old|new|。在我们的例子中,old\n,除了sed将\解释为转义字符。所以,我们必须加倍才能获得字面斜杠。替换文本new部分不算什么。在sed中,命令s|\\n||将替换找不到的第一个\n。由于您要替换所有此类事件,我们在替换命令的末尾添加g:这告诉sed全局进行更改。

使用awk

从第四个字段和第四个字段替换反斜杠-n:

$ awk -F\| '{gsub(/\\n/, "", $4); print}' OFS=\| file
a|b|c|dD|e
a1|b1|c1|d1d2|e1

要就地更改文件:

gawk -i inplace -F\| '{gsub(/\\n/, "", $4); print}' OFS=\| file

工作原理:

  • -F\|

    这告诉awk使用|作为输入的字段分隔符。

  • gsub(/\\n/, "", $4)

    这告诉awk在字段4中的任何地方都不用反斜杠替换。

  • print

    这告诉awk打印该行。

  • OFS=\|

    这告诉awk使用|作为输出的字段分隔符。