Скрипт UNIX и экранирование кавычек для скрипта AWK - PullRequest
0 голосов
/ 18 июля 2011

У меня есть сценарий UNIX, в котором есть блок nawk (это только часть сценария UNIX и NAWK. У него гораздо больше логики, и приведенный ниже код обязательно должен быть в nawk). Этот блок читает значение поиска дляКод ISO страны из файла со значениями кода страны и страны, и я сталкиваюсь с проблемой, когда в названии страны () или в одиночном апостропе есть скобка '

Sample values

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

Можете ли вы помочь мне преодолеть эти2 вопроса. Для одного апостропа я могу удалить его из строки или есть какой-нибудь способ, которым я могу просто точно настроить существующий код

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

}

Ответы [ 3 ]

1 голос
/ 19 июля 2011

Вам необходимо понять, где оболочка Unix обрабатывает кавычки и где Awk обрабатывает кавычки.

Учитывая, что в скрипте вам нужны как одинарные, так и двойные кавычки, я думаю, что вам лучше использоватьawk программный файл, содержащий сценарий, и затем с использованием:

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

Это позволяет избежать всех проблем, будет ли оболочка понимать это или нет.

Если вы можете 'Чтобы сделать это, вам, вероятно, следует продолжать использовать одинарные кавычки для окружения скрипта awk, но каждое вхождение

'

внутри скрипта должно быть заменено на:

'\''

Первыйкавычка завершает преобладающую строку в одинарных кавычках.Кавычка с обратной косой чертой встраивает в строку одинарную кавычку.Третья кавычка возобновляет обычную строковую операцию с одинарными кавычками, где единственным специальным символом является одиночная кавычка.

0 голосов
/ 18 июля 2011

Очевидно, проблема с цитированием.Передайте значение nawk, используя параметр -v.

Вместо

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

Используйте

nawk -v "COUNTRY_NAME=COTE D'IVOIRE" '{
        if (COUNTRY_NAME != " "){ ...
0 голосов
/ 18 июля 2011

Если этот код появляется в сценарии оболочки в этой форме, вам нужно экранировать одинарную кавычку с обратной косой чертой, чтобы она не заканчивала код nawk. Что-то вроде:

COUNTRY_NAME = "COTE D\'IVOIRE"

В случае с круглыми скобками вам нужно экранировать его в строке, чтобы nawk не видел его в качестве оператора группировки регулярных выражений:

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