我正在尝试通过删除换行符和重复的空格字符来重新格式化一些文本。
我的输入文字如下:
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
命令感兴趣。
答案 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
;internal;Compute01;Compute02;nova;;
sed ':1;/!/!{$!{N;b1}};s/!\{2,\}/!/;s/\n*//g;s/^ *//;s/ \{1,\}/ /g;s/!/&\n/;/^$/d;P;D' file