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

UNIX shell脚本和AWK脚本的转义引号,unix,nawk,Unix,Nawk,我有一个UNIX脚本,里面有nawk块(这只是UNIX和nawk脚本的一部分。它有更多的逻辑,下面的代码肯定应该是nawk) 此块从具有国家和国家代码值的文件中读取国家ISO代码的查找值,每当国家名称()中有括号时,我都会遇到问题 还是一根绳子 Sample values CIV@COTE D'IVOIRE COD@CONGO, Democratic Republic of (was Zaire) 你能帮我克服这两个问题吗?对于一个撇号,我可以把它从字符串中删除吗?或者有没有什么方法可以微调

我有一个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
code
processbody(){
纳克{
国家名称=“科特迪瓦”
如果(国家/地区名称!=“”){
file=“/tmp/country_codes.txt”
FS=“@”
while(getline“/tmp/CODE.txt”
}'/tmp/file.txt

}

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

COUNTRY_NAME = "COTE D\'IVOIRE"
在括号中,需要在字符串中对其进行转义,以便nawk不会将其视为regexp分组运算符:

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

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

而不是

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


您需要了解unixshell在哪里处理引号,Awk在哪里处理引号

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

awk -f awk.script [file1 ...]
这避免了shell是否理解它的所有问题

如果您不能这样做,那么您可能应该继续使用单引号来包围awk脚本,但是

'
脚本内部必须替换为:

'\''

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

国家名称的值是动态分配的,仅出于解释目的,我有一个值。它可以是ISO国家列表中的任何国家。请帮助您解释您真正想要做的事情。看起来您确实在尝试根据国家的完整名称在/tmp/file.txt中查找每一行的国家代码,并将其放入/tmp/code.txt中。对吗?
'\''