2012-10-10 87 views
2

我有使用GSUB的3個例子:AWK - 請求澄清例如

1.

echo -e "A A\nB B\nC C" | awk '{gsub($(!/B/),"",$1); print $1 "\t" $2}' 
    A 
B B 
    C 

2.

$ echo -e "A A\nB B\nC C" | awk '{gsub($(!/B/),"",$2); print $1 "\t" $2}' 
A 
B B 
C 

3.

$ echo -e "A A\nB B\nC C" | awk '{gsub($(!/B/),"",$0); print $1 "\t" $2}' 



. 

爲什麼在3個例子中awk沒有打印? awk不應該打印嗎?:

B B 

請解釋3個示例。

謝謝你的幫助。

+0

我不明白,在GSUB正則表達式使用否定的,你能指望它做的,做你有這方面的參考,或者你只是想弄清楚如何拆分'/ [^ B] /'? – tripleee

+0

@tripleee,爲什麼我不能使用gsub正則表達式否定'$(!/ B /)'?你能解釋一下嗎? – Tedee12345

+0

不,你能解釋你認爲的意思嗎?你想達到什麼目的? – tripleee

回答

3

對我來說,關鍵是:$(!/B/)。非常尷尬。這是什麼意思(或者至少我猜這意味着什麼)?

  • /B/:它試圖在整行匹配信B。如果它匹配返回1,否則0
  • :取消以前的結果代碼。
  • $():它返回整條生產線($0)或解決前面的指令後的第一場($1)。

第三種情況是可以的。

  • B匹配的指令是gsub($0, "", $0),一個空行。這很清楚。
  • B與指令不符時爲gsub($1, "", $0)。所以,由於兩個字母都是相同的,並且gsub會逐行替換很多次,所以它將刪除所有字符。添加另一個不同的角色,你會看到不同。

例如:

echo -e "A A 1\nB B 1\nC C 1" | awk '{gsub($(!/B/),"",$0); print $1 "\t" $2}' 

國債收益率:

1 

1 
+0

謝謝你的解釋。我仍然有這個問題。 爲什麼我不能使用gsub正則表達式否定'$(!/ B /)'?你能解釋一下嗎? – Tedee12345

+0

@ Tedee12345:你可以使用任何你想要的,但它很混亂。一見鍾情你的(或者任何寫它的人)想要達到的目標並不容易。 – Birei

+0

謝謝你的解釋。 – Tedee12345