【问题标题】:Awk - unterminated regexawk - 未终止的正则表达式
【发布时间】:2011-11-26 21:58:20
【问题描述】:

我正在编写一个 shell 脚本,它需要从如下所示的文本文件中提取值:

app.full.name /warfilelocation/ warfilename

我的 shell 脚本将遍历应用程序名称列表并使用 AWK 提取位置或名称。我已经使用以下命令在命令行上进行了测试: awk "\$1 ~/app.full.name/ { print $2 }" applications.txt

它返回我所期望的,但是当我把它放在一个 shell 脚本中时,我开始遇到问题。

我有一个看起来像这样的函数:

function get_location() {
        local application=$1
        awk "\$1 ~/^$application/ { print \$2 }"  applications.txt 
}

但是当我调用这个函数时,我得到以下错误:

awk: $1 ~/^app.full.name
awk:      ^ unterminated regexp
awk: cmd. line:1: app.full.name
awk: cmd. line:1:         ^ syntax error
awk: cmd. line:2: app.full.name/ { print $2 }
awk: cmd. line:2:    ^ syntax error

有没有人知道我在这里做错了什么。我认为我没有正确地转义变量,但无论我尝试什么,它似乎都不起作用。

提前致谢

【问题讨论】:

  • 你是如何调用函数的?应用的价值是什么?

标签: bash awk sh


【解决方案1】:

使用这种方法让 awk 识别 shell 变量:

awk -v "v1=$VAR1" -v "v2=$VAR2" '{print v1, v2}' input_file

更新

$ cat input
tinky-winky
dipsy
laa-laa
noo-noo
po

$ teletubby='po'

$ awk -v "regexp=$teletubby" '$0 ~ regexp' input
po

注意 anything 可以进入 shell 变量, 甚至是成熟的正则表达式,例如^d.*y。只要确保使用单引号 以防止外壳进行任何扩展。

【讨论】:

  • 他想将变量值填充到正则表达式中。不仅仅是打印出来
  • @Kent - 只是说明-v 允许您在 awk 脚本中使用 shell 变量。然后该变量可以用作match() 函数中的正则表达式;但那部分我漏掉了……
  • 我认为重点是 match()。因为变量(通过 -v)不能用于 awk 匹配检查,如($x~/here/)。至少我不知道在这种情况下如何使用。 :)
  • @Kent - 查看更新的答案,无需使用匹配功能
  • 谢谢,我一直在和两个斜线打架。 :D 很高兴知道如何在正则表达式中使用 var。 +1
【解决方案2】:

错误消息似乎表明 $application 末尾有一个杂散的换行符,它给出了“第 2 行”错误消息。

【讨论】:

  • 这个不一样,他要测试第一个字段,也就是$1~/^app/
  • 哦,谢谢,没有意识到这是实际的 awk 语法。已编辑。
【解决方案3】:

看这个:使用 awk match() 函数

kent$  app=app.ful
kent$  echo "app.full.name /warfilelocation/ warfilename"|awk -v a=$app '{if(match($1,a))print $2}' 
/warfilelocation/

【讨论】:

    【解决方案4】:

    如果不确切知道 $application 的值就很难判断,但您似乎在 $application 中有一个奇怪的字符,例如 " 或 / 或类似的东西。

    $ export application=foo/bar
    $ awk "\$1 ~/^$application/ { print \$1 }"
    gawk: cmd. line:1: $1 ~/^foo/bar/ { print $1 }
    gawk: cmd. line:1:                ^ parse error
    

    我会查看您在 $application 中的确切值,如果它包含 /,请将其转义。

    一种方法是使用:

    $ export application=`echo foo/bar | sed -e 's;/;\\\\/;g'`
    $ awk "\$1 ~/^$application/ { print \$1 }"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多