Вы можете использовать средства управления строкой bash, предоставляемые расширением параметра , в частности $ { ПЕРЕМЕННАЯ // ШАБЛОН / ЗАМЕНА }
форма. Имейте в виду, что /
- не единственный символ, который необходимо заменить: в замене s
символы \
, &
, перевод строки и разделитель s
все должны иметь префикс обратной косой черты.
replacement=$directory
replacement=${replacement//\\/\\\\}
replacement=${replacement//\//\\/}
replacement=${replacement//&/\\&}
replacement=${replacement//$'\n'/\\$'\n'}
sed -i "s/%DIR%/$replacement/g" -- "$config"
В качестве альтернативы можно использовать инструмент, не требующий таких кавычек, например awk или Perl.
directory=$directory awk '{gsub(/%DIR%/, ENVIRON["directory"])} 1' <"$config" >"$config.new" &&
mv -- "$config.new" "$config"
или
directory=$directory perl -i -pe 's/%DIR%/$ENV{directory}/g' "$config"
Параметры расширенного глобуса видны только для текущей оболочки и не для запущенных вспомогательных -оболочек. Вам нужно установить их внутри оболочки sub -также, чтобы была доступна опция glob. Также **
выполняет рекурсивный спуск, только если установлена другая расширенная опция globstar
. Только для вашего требования к текущему каталогу вы можете просто использовать*
bash -c 'shopt -s dotglob; stat /path/todir/*'
Обратите внимание на использование одинарных кавычек вокруг всего списка команд оболочки. Это намного безопаснее, так как вы можете избежать ненужного расширения переменной (передачи литеральной строки )и с большей легкостью использовать строки в кавычках.
Если у вас есть контроль над частью за пределами '..'
, вы можете установить параметр расширенной оболочки в самом вызове как
bash -O dotglob -c 'stat /path/todir/*'
Тем не менее, если доступна возможность использования внешних утилит, таких как find
, вы можете просто сделать ниже, что просто исключает.
(имя текущего каталога )и включает все файлы в текущем каталоге и передает его stat
одним выстрелом.
find. ! -path. -exec stat {} +
bash -c -O extglob 'stat /path/todir/!(.|..)'
-O extglob
включает дополнительные операторы сопоставления с образцом, в том числе !(pattern-list)
для отрицания.
[-+]O [shopt_option]
shopt_option is one of the shell options accepted by the shopt builtin (see
SHELL BUILTIN COMMANDS below). If shopt_option is present, -O sets the
value of that option; +O unsets it.
If the extglob shell option is enabled using the shopt builtin, several extended pattern matching
operators are recognized. In the following description, a pattern-list is a list of one or more
patterns separated by a |. Composite patterns may be formed using one or more of the following
sub-patterns:
?(pattern-list)
Matches zero or one occurrence of the given patterns
*(pattern-list)
Matches zero or more occurrences of the given patterns
+(pattern-list)
Matches one or more occurrences of the given patterns
@(pattern-list)
Matches one of the given patterns
!(pattern-list)
Matches anything except one of the given patterns