Почему awk не принимает ! как разделитель полей?

find. -path '*/__test__/*' -type f -name "index.js" \ 
    -execdir echo mv -vt../data.js {} \;

Удалите echo, который предназначен для пробного -запуска, чтобы запустить команду mvдля файлов.

1
11.03.2020, 10:22
2 ответа

!является триггерным символом для расширения истории 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 сам удаляет обратную косую черту.

12
28.04.2021, 23:20

Это не awkделает это. Это оболочка. !— это специальный символ оболочки.

Что делать

Всегда цитируйте свои аргументы. например.

awk -F'!'
10
28.04.2021, 23:20

Теги

Похожие вопросы