2

我有 3 个使用 gsub 的示例:

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个例子。

谢谢您的帮助。

4

1 回答 1

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
于 2012-10-10T16:35:59.320 回答