подстановка команд - файл cat вставляет кавычки

Вы просто пропустили ,тогда:

if ls /Volumes/Shared; then
    echo success
else
    echo failure
    exit 1
fi
0
03.05.2016, 22:55
2 ответа

Похоже, что вокруг содержимого noquotes.txt вставлены дополнительные кавычки, но не вокруг quotes.txt.

Это просто помощь Баша. Вы заметите, что он будет заключать в кавычки всякий раз, когда есть символ, который в противном случае интерпретировался бы Bash. Он действует так же, как и вы, используя кавычки только при необходимости. Попробуйте поместить в файл quotes.txt любое из следующего:

s/a$/a/g
s/"hi"/"bye"/g

Список можно продолжать и продолжать.

Теперь вернемся к вашему исходному вопросу. Прежде всего, ваш sed выводит странное сообщение. Из set -x очевидно, что вводится «s / a / b / g» , а не «s / a / b / g» . Я бы не поверил этому сообщению. Вот что GNU sed 4.2.1 выводит для "s / a / b / g" :

$ sed -e '"s/a/b/g"'
sed: -e expression #1, char 1: unknown command: `"'

Довольно ясно: поскольку первый символ - это имя команды, а там нет команды с именем ", sed не знает, что делать.

2
28.01.2020, 02:19

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

Для такой команды, как

sed -e "s/a/b/g"

На этом шаге убедитесь, что команде sedв качестве последнего аргумента задана строка s/a/b/g, а не"s/a/b/g".

Когда вы читаете строку "s/a/b/g"из файла с помощью catв подстановке команды, кавычки не удаляются, так как они не являются частью исходной команды (они являются частью считываемых данных из файла ).

Это означает, что sedполучит буквальную строку "s/a/b/g"в качестве выражения для запуска, и поэтому он жалуется, что не понимает первоначальную"(команду sed, ожидавшую команду ).

Что касается результатов трассировки set -x, рассматривайте их как не более чем отладочные данные. Оболочка bashдобавит кавычки вокруг строк, содержащих определенные символы в трассировке, поэтому это не указывает на то, что на самом деле было заключено в кавычки любого отдельного аргумента или как оно было интерпретировано вызванной утилитой.


Кроме того, чтобы запустить sedсо сценарием редактирования в файле, используйте параметр -f:

sed -f noquotes.txt <<<"aaa"

Кроме того, команда yв sedможет использоваться для более эффективной транслитерации между одним набором одиночных символов в другой, чем замена с помощью s. Вашу замену s/a/b/gлучше записать как y/a/b/.

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

tr a b <<<"aaa"
2
28.01.2020, 02:19

Теги

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