我有一个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 != " "){ ...