使用AWK gsub()删除重复的字符

时间:2016-07-07 06:52:41

标签: bash awk sed

我正在尝试通过删除换行符和重复的空格字符来重新格式化一些文本。

我的输入文字如下:

     hello  ! hello 
you! 

 hello



   world!!! hello


   universe  !

我试图将其格式化为:

hello !
hello you!
hello world!
hello universe !

我尝试使用此命令:

awk -v RS='!' '{gsub("^ *|\n", ""); gsub(" +", " ")} NF{print $0 RS }' file

但我仍然在行的开头有一些空格:

 hello !
hello you!
 hello world!
hello universe !

我不明白为什么第一个gsub没有删除前导空格(应该与模式^ *匹配)。

这个awk脚本出了什么问题?

我也对执行相同格式化的sed命令感兴趣。

2 个答案:

答案 0 :(得分:2)

$ awk -v RS='!' '{gsub(/^[[:space:]]*/, ""); gsub(/[[:space:]]+/, " ")} NF{print $0 RS}' file
hello !
hello you!
hello world!
hello universe !

如何运作

  • -v RS='!'

    这会将记录分隔符设置为感叹号。

  • gsub(/^[[:space:]]*/, "")

    这将删除所有前导空格。

    [[:space:]]是一种匹配任何空白区域的unicode安全方式,包括空格,制表符,换行符和其他一些比较模糊的空白区域。

  • gsub(/[[:space:]]+/, " ")

    用一个空格

  • 替换任何其他多个空格
  • NF{print $0 RS }

    如果此行中有任何单词,则会将其与记录分隔符一起打印。

答案 1 :(得分:1)

在sed

CMDLINE

;internal;Compute01;Compute02;nova;;

脚本

sed ':1;/!/!{$!{N;b1}};s/!\{2,\}/!/;s/\n*//g;s/^ *//;s/ \{1,\}/ /g;s/!/&\n/;/^$/d;P;D' file