2017-08-08 115 views
0

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

Employee : Kiara 20 [email protected] 
Employee : Connor 25 [email protected] 
Employee : Dylan 30 [email protected] 

变为:

Employee : Kiara_20_hoursat8dot25 
Employee : Connor_25_hoursat8dot00 
Employee : Dylan_30_hoursat9dot00 

我知道sed命令,使我只是想办法他们[执行上开始“雇员”线的变化。也许

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

你跟SED/AWK锁定,或者你采取任何shell脚本行解决方案? – Fabien

+0

当你使用awk时,你永远都不需要sed,你绝对不需要在awk中调用sed! –

回答

2
$ cat roster.txt 
foo : [email protected] 
Employee : Kiara 20 [email protected] 
Employee : Connor 25 [email protected] 
Employee : Dylan 30 [email protected] 

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

awk支持替换命令 - sub以取代第一个出现nce和gsub来替换所有的事件。也允许只改变特定字段

  • BEGIN{FS=OFS=" : "}使用:作为输入/输出字段分隔
  • gsub(/ /,"_",$2)_替换所有的空格只对第二场
  • 类似地,其它的取代的要求
  • 1在端命令是打印行的惯用方式,包括任何更改
  • 另请参见awk save modifications in place
+0

这会写入原始文件吗? – cbrad97

+0

@ cbrad97看到https://stackoverflow.com/questions/16529716/awk-save-modifications-in-place – Sundeep

+0

所以如果我没有GAWK 4.1或更高版本,我需要创建一个临时文件写入?我需要文件的原始名称是完整的 – cbrad97

0

你真的不需要使用这两种工具,要么会做你需要的一切。

SED解决方案:评论后

sed -i -e 's/^Employee : \([^ ]*\) \([0-9]*\) [email protected]\([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 
+0

如果我不知道冒号后的字段怎么办?我只知道我有一系列的sed替换可以在冒号后的任何文本上执行。 – cbrad97

+0

使图案更通用。你想要尽可能限制并保持模式,同时仍然捕获你的所有情况,你最不希望发生的替代是你不想要的。我将增加另一个可用于样本但可能更危险的选项。 – Rob

2

我会写:

sed '/^Employee :/ {s/@/at/; s/\./dot/; s/ /_/3g}' <<END 
Employee : Kiara 20 [email protected] 
Employee : Connor 25 [email protected] 
Employee : Dylan 30 [email protected] 
Foo : bar [email protected] 
END 
Employee : Kiara_20_hoursat8dot25 
Employee : Connor_25_hoursat8dot00 
Employee : Dylan_30_hoursat9dot00 
Foo : bar [email protected] 

需要GNU的sed为s命令3g修改

+0

不错,但我已经使用'!b',请参阅https://www.gnu.org/software/sed/manual/sed。 html#编程 - 命令 – Sundeep

+0

下一个记录是否意味着当前文件中的下一个文件或下一行?当我运行命令时,!n被替换为另一个文件名? – cbrad97

+0

我认为这是bash做[历史扩展](https://www.gnu.org/software/bash/manual/bashref.html#History-Interaction),其中'!n'是您以前的命令,以“n ”。尝试使用'set + H'关闭hist扩展(用'set -H'打开它) –