Вы не можете использовать одинарную кавычку в программе awk, заключенной в одинарные кавычки.
Один из способов обойти это — присвоить символ кавычки переменной awk с помощью -v
:
echo '%27SWAY%27'| awk -v q = "'" '{ gsub("%27",q,$1); print $1 }'
'SWAY'
Другой способ — использовать escape-последовательность восьмеричных символов \047
:
$ echo '%27SWAY%27'| awk '{ gsub("%27","\047",$1); print $1 }'
'SWAY'
Наконец, вы можете поместить awk-программу в отдельный файл, и в этом случае одинарная кавычка не вызовет проблем:
$ cat a.awk
{ gsub("%27","'",$1); print $1 }
$ echo '%27SWAY%27'| awk -f a.awk
'SWAY'
Всегда используйте 3-значный восьмеричный \047
всякий раз, когда вам нужна одинарная кавычка в awk, поскольку она переносима во всех awks и во всех контекстах (регулярные выражения и строки, поиск и замена, командная строка и файловый скрипт и т. д.). \47
потерпит неудачу, если после него будет больше цифр (например, попробуйте sub(/%27/,"\471")
против sub(/%27/,"\0471")
), и даже если возникнет соблазн, не используйте шестнадцатеричный \x27
, см. awk.freeshell.org/PrintASingleQuote
Спасибо @EdMorton, исправлено.
Не могли бы вы попробовать выполнить тоже.
awk '{gsub("%27","\047")} 1' Input_file
О, я только что увидел, что у @jas уже есть это, позвольте мне добавить решение sed
сейчас.
sed 's/%27/'"'"'/g' Input_file
Или, согласно комментарию сэра @ghoti, можно использовать в sed
, например:
sed "s/%27/'/g" input_file
Или, черт возьми, sed "s/%27/'/g" input_file
.
Вы можете использовать расширение строки BASH, если ваш BASH недавний:
$ echo "%27SWAY%27" | awk $'{gsub("%27","\'",$1); print $1 }'
'SWAY'
«$» перед «{..}» интерпретирует «\» для awk.
да. На самом деле я использовал его в сценарии bash, и $ действительно работал.
Это может сработать для вас (GNU sed):
sed 's/%27/'\''/g' file
Проделайте дыру в базовой оболочке и используйте одинарную кавычку.
Спасибо. Я буду использовать второй вариант, используя \47. это кажется проще, чем два других.