UNIX AWK转义单引号

时间:2011-07-18 17:28:01

标签: unix nawk

  

可能重复:
  UNIX shell script and escaping quotes for AWK script

我有一个UNIX脚本,里面有nawk块(这只是UNIX和NAWK脚本的一部分。它有更多的逻辑,下面的代码肯定应该是nawk) 此块从具有国家/地区和国家/地区代码值的文件中读取国家/地区ISO代码的查找值,并且每当国家/地区名称中有括号时我都会遇到问题() 或者是一个叛徒'

这些只是样本值,它可以包含许多具有单引号和parantheses的国家

Sample values

CIV@COTE D'IVOIRE
COD@CONGO, Democratic Republic of (was Zaire)
HRV@CROATIA (local name: Hrvatska) 

如果一个字符串有单引号或者parantheses,你能帮助我克服这两个问题。

无论如何,我可以动态地逃避这个单引号和叛逆者吗?

代码

processbody() {

nawk '{

           // These are sample values not exhaustive
           COUNTRY_NAME = "COTE D'IVOIRE" // this is read dynamically inside nawk
           #COUNTRY_NAME = "CONGO, Democratic Republic of (was Zaire)"  // this is read dynamically inside nawk
           #COUNTRY_NAME = "CROATIA (local name: Hrvatska)"  // this is read dynamically inside nawk
            if (COUNTRY_NAME != " "){

                           file = "/tmp/country_codes.txt"
                          FS = "@"
                          while( getline < file ) {
                          if( $0 ~ COUNTRY_NAME ) {
                          COUNTRY_CODE = $1
                           }
                           }
                           close( file )



            }

 printf("%s\n",COUNTRY_CODE) > "/tmp/code.txt"

  }' /tmp/file.txt
  }

  processbody

1 个答案:

答案 0 :(得分:1)

你有几个问题。在单引号字符串(nawk正文)中硬编码单引号,以及您正在使用正常表达式匹配的~运算符,而不是字符串比较。

你是什么意思“这是在nawk中动态读取的”?在您的示例中,您将对该值进行硬编码。你是从文件中读到的吗?

有几种方法可以在单个引用的字符串中获得单引号:

  1. 使用反斜杠转义单引号:nawk '... x="what\'s up" ...'
  2. shell string contatenation:nawk '...x="what'"'"'s up" ...'
  3. 使用heredoc:
  4. nawk_script=<<'END'
    { 
      x="what's up" 
      ...
    }
    END
    nawk "$nawk_script" /tmp/file.txt
    

    关于括号问题,只需使用字符串比较函数而不是正则表达式匹配运算符:

    if (index($0, COUNTRY_NAME) > 0) {
      ...
    }