【问题标题】:Embedding into a shell script an awk program with a single quote in it将带有单引号的 awk 程序嵌入到 shell 脚本中
【发布时间】:2015-07-02 10:29:16
【问题描述】:

我有一个单行文本文件 nik.txt 和一个简单的 awk 脚本,如下所示:

LagartijaNick>cat nik.txt
hey the're
LagartijaNick>cat tmp.awk
BEGIN {}
{
    searchName=tolower($0);
    if ( searchName ~ /'re/ ) {
       print $0
    }
}
LagartijaNick>awk -f tmp.awk nik.txt
hey the're

上面的 awk 脚本按预期打印整个记录。但现在我必须将 awk 嵌入到 BASH 脚本中,如下所示:

#!/bin/bash
infile=$1
function doThis () {
   awk 'BEGIN {}
   {
      searchName=tolower($0);
      if ( searchName ~ /'re/ ) {
         print $0
      }
   }' $infile
}
doThis
exit 0

这会返回:

./tmp.sh: line 9: syntax error near unexpected token `)'
./tmp.sh: line 9: `   if ( searchName ~ /\'re/ ) {'

简单,需要转义单个语音标记?但我无法让它工作。 我试过了:

if ( searchName ~ /\'re/ ) {
if ( searchName ~ /''re/ ) {

我做错了什么?我得到的只是语法错误...

我正在使用以下版本的 bash:

LagartijaNick>/bin/bash --version
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

【问题讨论】:

  • 脚本中间有一个单引号,它结束了引用的命令,bash 尝试解释 )。此外,BEGIN 块虽然无害,但完全没有意义。在 bash 中转义单引号真的很困难,你最好将它作为变量传递给脚本 -vQ="'" 然后你的正则表达式比较将是 $0 ~ Q"re"
  • grep -i "'re" nik.txt
  • 脚本格式混乱。反引号 (`) 实际上是脚本的一部分,还是试图将整个内容标记为代码?我开始编辑您的问题以修复格式,并注意到您没有一组花括号来定义函数 doThis 的范围,因此很难确切知道您的意图。 (也许这就是问题所在?)
  • 我应该说部分问题。显然你也需要转义单引号。

标签: linux bash shell awk


【解决方案1】:

结合使用单引号设置变量并删除不必要的BEGIN的建议:

#!/bin/bash
infile=$1
function doThis () {
    read -d '' cmd <<EOA
    awk -vQ="'" '
    {
        searchName=tolower(\$0);
        if ( searchName ~ Q"re" ) {
            print \$0
        }
    }' $infile
EOA
    eval $cmd
}
doThis
exit 0

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多