Почему я не могу избежать цитаты в gawk? - PullRequest
3 голосов
/ 05 февраля 2012

Я пытаюсь сделать следующее, но я слишком устал и не могу думать, или что-то странное происходит с побегами:

scanimage -L | gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}'
pipe bquote> 

Ответы [ 5 ]

7 голосов
/ 05 февраля 2012

Чтобы сделать это, нужно создать переменную, содержащую одинарную кавычку, а затем использовать ее:

scanimage -L | gawk '/N650U/ {print gensub(q"`", "", "g", $2)}' q="'"

Однако, поскольку вы используете его в классе символов, это не сработает, поэтому вам нужно будет сделать следующее:

scanimage -L | gawk '/N650U/ {print gensub("[`'\'']", "", "g", $2)}'
                    <--      1st pair       -->  <--   2nd pair  -->

Другая альтернатива при использовании bash заключается в использовании $'', который поддерживает , поддерживает экранирование одинарных кавычек

scanimage -L | gawk $'/N650U/ {print gensub("[`\']", "", "g", $2)}'

Все, что вы делаете во втором случае, - это создание пары одинарных кавычек непосредственно перед вашей буквальной одинарной кавычкой, экранирование одинарной кавычки, чтобы оболочка не интерпретировала ее, а затем создала еще одну пару одинарных кавычек после нее.

Пример с одинарной кавычкой в ​​регулярном выражении

$ echo $'foo`\'' | awk '{gsub(/[o`'\'']/,"#")}1'
f####

Пример с одинарными кавычками вне регулярного выражения

$ echo "foo" | awk '{print q$0q}' q="'"
'foo'

Пример с одинарной кавычкой внутри $''

echo $'foo`\'' | awk $'{gsub(/[o`\']/,"#")}1'
f####
2 голосов
/ 05 февраля 2012

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1004* * * * * * * *1004*

Заключение символов в одинарные кавычки (') сохраняет буквальное значение каждого символа в кавычках. Одиночная кавычка может отсутствовать между одинарными кавычками, даже если ей предшествует обратная косая черта.

Вы можете изменить команду на:

$ scanimage -L | awk '/N650U/ {print gensub("['"'"'`]", "", "g", $2)}'
1 голос
/ 05 февраля 2012

Оболочка '...' не поддерживает обратную косую черту. Боюсь, вместо этого вам придется использовать «...».

gawk "/N650U/ {print gensub(\"['`]\", \"\", \"g\", \$2)}\"

(Обратите внимание, что оболочка "..." расширяет переменные $, поэтому вам также нужно избегать этого!)

0 голосов
/ 22 сентября 2014

Правильный способ сделать это просто:

scanimage -L | gawk '/N650U/ {print gensub(/[\047`]/, "", "g", $2)}'

Это не влияет на использование \047 для одиночной кавычки, но, кроме того, учитывая, что все остальные опубликованные решения используют разделители строк, обратите внимание на использование разделителей регулярных выражений вместо разделителей строк вокруг регулярного выражения gsub (). первый аргумент Это имеет значение, см. Например:

$ printf 'a\\tb\n' | awk '{sub(/\\t/,"X")}1'
aXb
$ printf 'a\\tb\n' | awk '{sub("\\t","X")}1'
a\tb
$ printf 'a\\tb\n' | awk '{sub("\\\\t","X")}1'
aXb

Единственный раз использовать разделители строк в контексте регулярного выражения - это когда вам нужно объединить литерал с переменной, например ::

awk '{sub("<"var">","")}1'

Для получения подробной информации посмотрите разделители строк и регулярных выражений на странице руководства.

0 голосов
/ 05 февраля 2012
gawk '/N650U/ {print gensub("[\'`]", "", "g", $2)}'
     ^                         ^
     beginning of sq string       end of single quoted string

Немного некрасиво, но это работает:

gawk '/N650U/ {print gensub("['"'"'`]", "", "g", $2)}'
...