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