В обработке командной строки есть шаг, который называется шагом удаления кавычек . Обычно это последнее, что происходит перед выполнением команды, и оно удаляет внешние наборы кавычек, которые вы использовали для цитирования строк в команде.
Для такой команды, как
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"