UNIX shell脚本和AWK脚本的转义引号

时间:2011-07-18 04:00:48

标签: unix nawk

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

Sample values

CIV@COTE D'IVOIRE
COD@CONGO, Democratic Republic of (was Zaire)

你能帮助我克服这两个问题吗。对于一个单一的使徒,我可以把它从字符串中删除吗?或者我有什么方法可以微调现有的代码

Code

processbody() {

nawk '{

            COUNTRY_NAME = "COTE D'IVOIRE"


            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

}

3 个答案:

答案 0 :(得分:1)

您需要了解Unix shell处理引号的位置以及Awk处理引号的位置。

鉴于脚本中需要单引号和双引号,我认为最好使用awk程序文件来包含脚本,然后使用:

awk -f awk.script [file1 ...]

这避免了shell是否理解它的所有问题。

如果你不能这样做,那么你应该继续使用单引号来包围awk脚本,但是每次出现

'
脚本中的

必须替换为:

'\''

第一个引号终止了主流的单引号字符串。反斜杠引用在字符串中嵌入单引号。第三个引用恢复正常的单引号字符串操作,其中唯一的特殊字符是单引号。

答案 1 :(得分:0)

如果此代码出现在此窗体的shell脚本中,则需要使用反斜杠转义单引号,以便它不会终止nawk代码。类似的东西:

COUNTRY_NAME = "COTE D\'IVOIRE"

在括号中,您需要在字符串中对其进行转义,以便nawk不会将其视为正则表达式分组运算符:

COUNTRY_NAME = "CONGO, Democratic Republic of \\(was Zaire\\)"

答案 2 :(得分:0)

显然是引用的问题。使用-v选项将值传递给nawk。

而不是

nawk '{
        COUNTRY_NAME = "COTE D'IVOIRE"
        if (COUNTRY_NAME != " "){ ...

使用

nawk -v "COUNTRY_NAME=COTE D'IVOIRE" '{
        if (COUNTRY_NAME != " "){ ...