寻找“;”然后删除空格直到下一个字符

时间:2019-04-08 23:48:24

标签: awk

我有很多行以“;”开头,然后是1个或更多空格,然后在同一行上还有其他一些字符。我需要删除“;”后面的空格最多但不包括后面的字符。

我尝试了以下代码的一些变体,因为它在带有空格的行上工作得很好,但是我对awk不太熟悉。

super

样本输入:

awk '{gsub(/^ +|  +$/,"")}1'  filea>fileb

想要的输出:

;    4
;  group 452
;          ring

4 个答案:

答案 0 :(得分:2)

要删除第一个分号后的空白,请尝试:

$ awk '{sub(/^;[[:blank:]]+/, ";")} 1' filea
;4
;group 452
;ring

正则表达式^;[[:blank:]]+匹配第一个分号以及其后的所有空格或制表符。函数sub;代替。由于这仅发生一次(在开始时),因此不需要gsub

[:blank:]是指定空格的Unicode安全方法。

答案 1 :(得分:2)

awk '{sub(/^; +/,";")}1' file

;4
;group 452
;ring

答案 2 :(得分:1)

sed也可以:

sed -E 's/^(;){1}([[:blank:]]+)/\1/' file

括号用作选择器,\number组合表示相应的选择。

^(;){1}([[:blank:]]+)中,我们检查行的开头(^)和;是否出现一次({1}),然后是任意数量的空白字符{ {1}},然后将匹配的模式替换为我们的第一选择。

答案 3 :(得分:0)

这将字段分隔符FS定义为记录的开头,后跟;和一组空格。然后,它将输出字段分隔符OFS重新定义为;。从FSOFS的转换是通过将$1重新分配给自己完成的。

awk 'BEGIN{FS="^; *";OFS=";"}{$1=$1}1'

awk -F'^; *' -vOFS=";" '{$1=$1}1'