Bash на macOS: как заменить путь в файле другой строкой? - PullRequest
0 голосов
/ 31 октября 2019

Для интеграционных тестов у меня есть вывод, который содержит полные пути к файлам. Я хочу, чтобы мой тестовый скрипт заменил пользовательское начало пути к файлу (например, /Users/uli/) на общее слово (USER_DIR), чтобы я мог сравнивать файлы.

Проблема, связанная сКонечно, есть косые черты на пути. Я попробовал решения, данные здесь и здесь , но они не работают для меня:

#!/bin/bash

old_path="/Users/uli/"
new_path="USERDIR"

sed -i "s#$old_path#$new_path#g" /Users/uli/Desktop/replacetarget.txt

Я получаю сообщение об ошибке

sed: 1: "/Users/uli/Desktop/repl ...": invalid command code u

Это версия sed, которая поставляется с macOS 10.14.6 (она не имеет опции --version и установлена ​​в /usr/bin/, так что понятия не имею, что именноверсия).

Обновление:

Я также пытался

#!/bin/bash

old_path="/Users/uli/"
old_path=${old_path//\//\\\/}
new_path="USERDIR"
regex="s/$old_path/$new_path/g"

echo $old_path
echo $regex

sed -i $regex /Users/uli/Desktop/replacetarget.txt

Но я получаю ту же ошибку. Что я делаю не так?

1 Ответ

0 голосов
/ 31 октября 2019

BSD sed требует аргумент, следующий за -i (пустая строка '' указывает на отсутствие резервной копии, аналогично -i без аргументов в GNU sed). В результате ваш сценарий обрабатывается как расширение файла резервной копии, а входной файл - как сценарий.

old_path="/Users/uli/"
new_path="USERDIR"
sed -i '' "s#$old_path#$new_path#g" /Users/uli/Desktop/replacetarget.txt

Однако sed является s tream ed итор, основанный на редакторе файлов ed, поэтому использование -i является признаком того, что вы используете неправильный инструмент для начала. Просто используйте ed.

old_path="/Users/uli/"
new_path="USERDIR"
printf 's#%s#%s#g\nwq\n' "$old_path" "$new_path" | ed /Users/uli/Desktop/replacetarget.txt

Обязательное предупреждение: ни один редактор не параметризован как таковой;вы упрощаете генерацию сценария динамически, а это значит, что вы обязаны убедиться, что полученный сценарий действителен. (Например, если какой-либо параметр содержит ;, его лучше экранировать, чтобы (s)ed не видел его в качестве разделителя команд.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...