Когда я использую !
в качестве разделителя полей eg, awk -F!
он выдает сообщение об ошибке bash: !: event not found
. Почему? Он принимает awk -F"\!"
. Bash версии 3.2.25
решение1
!
является триггерным символом для Bash'аистория расширение. Если это включено, то что-то вроде !foo
в командной строке расширяется до последней команды, которая начинается с foo
. Или, если такой командной строки нет, оболочка выдает ошибку, как здесь.
Хотя это не должно ничего делать как последний символ слова. Это на самом деле работает так, как вы и предполагали, во всех версиях Bash, которые я пробовал:
$ echo 'aa!bb' | awk -F! '{print $1}'
aa
В более поздних версиях !
также не должно выполняться никаких действий перед закрывающей двойной кавычкой, поэтому -F"!"
работает в более поздних версиях, но не в 3.2.
Обратная косая черта или одинарные кавычки будут работать, чтобы избежать этого, т. е. ни то, \!foo
ни другое не '!foo'
будет расширяться. Конечно, вы также можете остановить это, полностью отключив расширение истории, с помощью set +H
.
С двойными кавычками все страннее. В них обратная косая черта отключает расширение истории, но сама обратная косая черта остается на месте:
$ printf '%s\n' "\!foo"
\!foo
В данном случае awk -F"\!"
это работает, поскольку awk сам удаляет обратную косую черту.
решение2
Это не awk
то, что делает это. Это оболочка. !
— это специальный символ в оболочке.
Что делать
Всегда цитируйте свои аргументы. Например:
awk -F'!'