Насколько я вижу, размещенный вами скрипт sed не будет иметь никакого эффекта - части "search" и "replace" одинаковы.
То, что вы можете сделать, может сделать:
ROW=$(echo $ROW | sed -e "s/ /\\\\ /g")
или (лучше):
ROW=$(echo $ROW | sed -e 's/ /\\ /g')
В последнем примере используются одинарные кавычки, так что оболочка не обрабатывает обратную косую черту специально.
Относительно второй проблемычто возникло: специальные символы (например, ~
) расширяются с помощью bash, когда они встречаются в параметрах программы.Они не будут расширены при сохранении их в переменной, а также не будут проверять и расширять содержимое переменной при передаче ее в качестве параметра команде.
Именно поэтому rsync $NEWROW ...
не работает - rsync получаетнемодифицированное содержимое $ NEWROW в качестве первого параметра и затем должно было бы выполнить расширение, подобное оболочке, самостоятельно.
Единственный известный мне обходной путь - это запустить команду в подоболочке, то есть:
ROW="~/a b c"
$NEWROW=$(echo $ROW | sed -e 's/ /\\ /g')
bash -c "ls -ld $f"
Это заставит текущий запущенный bash извлечь содержимое переменных (т.е. ~/a\ b\ c
и передать его второй оболочке, которую он собирается вызвать. Этот "внутренний" bash получит команду вместе с параметрами изатем, конечно, к расширению параметра.
Извините, что упустил эту точку в начале, я сосредоточился только на части вопроса, связанной с регулярными выражениями.
Нашел другое возможное решение: после преобразования пути с помощью sed(например, NEWROW=$(echo $ROW | sed -e 's/ /\\ /g')
try:
eval ls -ld $NEWROW
или eval rsync $ NEWROW / other / path
Это также должно работать, свлияние на производительность запуска подоболочек.
// РЕДАКТИРОВАТЬ: Добавлено пропущенное g
в сценарий sed
// РЕДАКТИРОВАТЬ: Добавлен обходной путь для проблемы расширения пути
// РЕДАКТИРОВАТЬ: Addes eval решение