【问题标题】:AWK - request for clarification exampleAWK - 请求澄清示例
【发布时间】:2012-10-01 04:21:59
【问题描述】:

我有 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}'



.

为什么在 awk 的 3 示例中没有打印任何内容? awk 不应该打印吗?:

B   B

请解释 3 个例子。

感谢您的帮助。

【问题讨论】:

  • 我不明白在 gsub 正则表达式中使用否定,你希望它做什么,你有没有参考,或者你只是想弄清楚如何拆分在/[^B]/?
  • @tripleee,为什么我不能使用 gsub 正则表达式否定 $(!/B/)?你能解释一下吗?
  • 不,能解释一下你认为这意味着什么吗?你想完成什么?
  • 我只是想知道你是否可以使用这种形式的否定$(!/B/)?如果不能,为什么?
  • 如果它按照你的想法做,继续;但也许可以解释一下它应该对我们其他人做什么。在我看来,您正在尝试完成一些可能无法按您期望的方式工作的事情,但如果您不告诉我们您的期望,我们将无法帮助您解决这个问题。韦尔普,您的电话。

标签: awk gsub


【解决方案1】:

对我来说关键点是:$(!/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

【讨论】:

  • 感谢您的解释。我还有这个问题。为什么我不能使用 gsub 正则表达式否定 $(!/B/)?你能解释一下吗?
  • @Tedee12345:你可以使用任何你想要的东西,但这很令人困惑。第一眼看到你(或写它的人)想要达到的目标并不容易。
  • 感谢您的解释。
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 2012-07-29
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
相关资源
最近更新 更多