【问题标题】:AWK: field separator contains a '+'AWK:字段分隔符包含一个“+”
【发布时间】:2009-11-07 15:19:30
【问题描述】:
echo -n 'a001~!+rr001~!+1~!+TEST DATA 1' | awk 'BEGIN {FS="~!+"} {print $2}'

我将字段分隔符设置为“~!+”并且想要打印第二个字段。 AWK 打印一个无关的 + , rr001 作为 +rr001 。

我做错了什么?

【问题讨论】:

  • 使用-F '~!\+';单引号是必须的(或者,如果你使用双引号,写-F "~!\\+"(但使用单引号更简单)。

标签: shell awk


【解决方案1】:
 $ echo -n 'a001~!+rr001~!+1~!+TEST DATA 1' | awk '开始 {FS="~!\\+"} {打印 $2}'
rr001 

双重转义似乎也可以完成这项工作。

【讨论】:

    【解决方案2】:

    您的问题是您的匹配条件 '~!+' 是一个正则表达式。

    来自文档:“+ This symbol 类似于 '*',只是前面的表达式必须至少匹配一次。这意味着 'wh+y' 将匹配 'why' 和 'whhy',但不是'wy',而 'wh*y' 将匹配所有这三个字符串。”

    所以本质上你要求匹配〜!或 ~!! 等。所以你根本不匹配 +。这就是您在输出中看到 + 的原因。您应该可以使用“~!\\+”来让您的表达发挥作用

    【讨论】:

      【解决方案3】:

      换一种方式

      $ 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
      

      【讨论】:

      • 第一个提议的解决方案不是一个好主意 - 有多种原因。第二个将起作用,但与将正则表达式修复为“~!\+”相比,它是多余的。使用 '-F' 比在 BEGIN 块中设置 FS 更好,但你应该在它周围使用单引号而不是双引号 - 特别是当它包含反斜杠时。
      • “第一个提议的解决方案不是一个好主意”——确实同意!!
      猜你喜欢
      • 2012-01-05
      • 2014-10-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      • 1970-01-01
      相关资源
      最近更新 更多