2009-11-07 80 views
0
echo -n 'a001~!+rr001~!+1~!+TEST DATA 1' | awk 'BEGIN {FS="~!+"} {print $2}' 

我將字段分隔符設置爲「〜!+」並且想要打印第二個字段。 AWK用rr001打印一個+ rr001作爲+。AWK:字段分隔符包含'+'

我在做什麼錯?

+2

使用'-F'〜!\ +'';單引號是必要的(或者,如果你使用雙引號,寫'-F「〜!\\ +」'(但使用單引號更簡單)。 – 2009-11-07 15:34:52

+0

這應該是答案 – Xolve 2009-11-07 16:47:04

回答

1
 $ echo -n 'a001~!+rr001~!+1~!+TEST DATA 1' | awk 'BEGIN {FS="~!\\+"} {print $2}' 
rr001

雙重逸出也似乎做的工作。

0

另一種辦法來做

$ echo 'a001~!+rr001~!+1~!+TEST DATA 1' | awk -F"+" '{gsub(/~!$/,"",$2);print $2}' 
rr001 

或本

$ echo 'a001~!+rr001~!+1~!+TEST DATA 1' | awk -F"[~][!][+]" '{print $2}' 
rr001 

$ echo 'a001~!+rr001~!+1~!+TEST DATA 1' | awk -F'~!\\+' '{print $2}' 
rr001 
+0

第一個建議的解決方案不是一個好主意 - 出於多種原因,第二個會起作用,但與修復正則表達式爲「〜!\ +」相比,這是一種矯枉過正的做法。使用'-F'比在BEGIN塊中設置FS更好,但是您應該使用單引號,而不是雙引號 - 特別是當它包含反斜槓時 – 2009-11-07 15:33:18

+0

然後你可以顯示使用'〜!\ +'的代碼和結果嗎? – ghostdog74 2009-11-07 15:45:39

+0

「首先提出的解決方案不是一個好主意」 - 同意! – Xolve 2009-11-07 16:51:47

1

您的問題是,你的匹配標準 '〜!+' 是一個正則表達式。

從文檔:「+ This symbol類似於'*',只是前面的表達式必須匹配至少一次,這意味着'wh + y'將匹配'why'和'whhy',但不匹配' wy',而'wh * y'會匹配所有這三個字符串。「

所以基本上你要求匹配〜!或〜!!等等。所以你根本不匹配+。這就是你在輸出中看到+的原因。您應該能夠使用「~!\\+」讓你的表達工作

相關問題