我有一个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
答案 0 :(得分:1)
你有几个问题。在单引号字符串(nawk正文)中硬编码单引号,以及您正在使用正常表达式匹配的~
运算符,而不是字符串比较。
你是什么意思“这是在nawk中动态读取的”?在您的示例中,您将对该值进行硬编码。你是从文件中读到的吗?
有几种方法可以在单个引用的字符串中获得单引号:
nawk '... x="what\'s up" ...'
nawk '...x="what'"'"'s up" ...'
nawk_script=<<'END'
{
x="what's up"
...
}
END
nawk "$nawk_script" /tmp/file.txt
关于括号问题,只需使用字符串比较函数而不是正则表达式匹配运算符:
if (index($0, COUNTRY_NAME) > 0) {
...
}