2017-08-08 67 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'打開它) –