在awk声明中的sed

时间:2017-08-08 14:35:40

标签: awk sed

我想在文件roster.txt的行上执行一系列sed命令,只从关键字开始。例如:

Employee : Kiara 20 hours@8.25
Employee : Connor 25 hours@8.00
Employee : Dylan 30 hours@9.00

变为:

Employee : Kiara_20_hoursat8dot25
Employee : Connor_25_hoursat8dot00
Employee : Dylan_30_hoursat9dot00

我知道用于进行更改的sed命令我只想在以“employee”开头的行上执行这些更改。也许

awk '$1 == "Employee" {sed -i -e 's/\./dot/g' roster.txt}' roster.txt

3 个答案:

答案 0 :(得分:3)

$ cat roster.txt
foo : bar@baz.123
Employee : Kiara 20 hours@8.25
Employee : Connor 25 hours@8.00
Employee : Dylan 30 hours@9.00

$ awk 'BEGIN{FS=OFS=" : "} $1=="Employee"{gsub(/ /,"_",$2); gsub(/@/,"at",$2); gsub(/\./,"dot",$2)} 1' roster.txt
foo : bar@baz.123
Employee : Kiara_20_hoursat8dot25
Employee : Connor_25_hoursat8dot00
Employee : Dylan_30_hoursat9dot00

awk也支持替换命令 - sub替换第一次出现,gsub替换所有出现次数。也允许仅更改特定字段

  • BEGIN{FS=OFS=" : "}使用 : 作为输入/输出字段分隔符
  • gsub(/ /,"_",$2)仅为第二个字段
  • 替换_的所有空格
  • 同样地,根据需要进行其他替换
  • 命令结尾处的
  • 1是用于打印该行的惯用方式,包括所做的任何更改
  • 另见awk save modifications in place

答案 1 :(得分:2)

我写道:

sed '/^Employee :/ {s/@/at/; s/\./dot/; s/ /_/3g}' <<END
Employee : Kiara 20 hours@8.25
Employee : Connor 25 hours@8.00
Employee : Dylan 30 hours@9.00
Foo : bar baz@qux.blah
END
Employee : Kiara_20_hoursat8dot25
Employee : Connor_25_hoursat8dot00
Employee : Dylan_30_hoursat9dot00
Foo : bar baz@qux.blah

3g命令的s修饰符需要GNU sed

答案 2 :(得分:0)

你真的不需要使用这两种工具,也可以做你需要的一切。

sed解决方案:

 sed -i -e 's/^Employee : \([^ ]*\) \([0-9]*\) hours@\([0-9]\)\.\([0-9]*\)/Employee : \1_\2_hoursat\3dot\4/' roster.txt

评论后编辑:

如果您想要一个非常通用的替代品,只使用适合您样品的sed:

sed -i -e 's/\([^:]\) \([^:]\)/\1_\2/g' -e 's/@/at/g' -e 's/\./dot/g' roster.txt