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

我有一个UNIX脚本,里面有一个nawk块(这只是UNIX和NAWK脚本的一部分,它有更多的逻辑,下面的代码一定在nawk)这个块读取国家ISO代码的查找值从具有国家代码值和国家代码值的文件中删除,并且每当国家名称中有一个括号()或一个单独的'

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

你能帮助我克服这两个问题。对于一个单一的使命,我可以把它从string中删除,或者有什么办法,我可以微调现有的代码

 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 

}

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

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

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

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

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

 ' 

脚本内部必须替换为:

 '\'' 

第一个报价结束了普遍的单引号字符串。 反斜杠引用将单个引号嵌入到字符串中。 第三个报价恢复正常的单引号字符串操作,其中唯一的特殊字符是单引号。

如果此代码以这种形式出现在shell脚本中,则需要用反斜杠转义单引号,以便它不会终止nawk代码。 就像是:

 COUNTRY_NAME = "COTE D\'IVOIRE" 

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

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

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

代替

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

使用

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