#bash #macos #sed
#bash #macos #sed
Вопрос:
Я новичок в мире macOS и Unix, но мне приходится с этим работать. Мой вопрос таков: могу ли я предоставить sed-команде массив, содержащий пути, чтобы sed использовал содержащуюся в нем переменную в качестве пути? Я пытаюсь манипулировать dock пользователя, которого я идентифицировал до этого. Мой код на данный момент таков:
#!/bin/bash
...
...
for change in '${plistToModify[@]}'
do
sed 's<_CFURLSTRING>file:///Applications/name_old.app</_CFURLSTRING>#<_CFURLSTRING>file:///Applications/name_new.app</_CFURLSTRING>#' '${plistToModify[$change]}'
done
killall Dock
(К вашему сведению, я изменил название приложения)
Я попытался заключить массив в двойные кавычки в начале цикла for и в конце sed, но ничего не сработало
Массив содержит неизвестное количество путей, которые выглядят следующим образом:
/Users/theUser/Library/Preferences/com.apple.dock.plist
Возможно ли это вообще или я что-то упускаю?
Заранее спасибо.
Комментарии:
1. Это ассоциативный или индексированный массив? Если проиндексировано, то вам нужно
"$change"
, а не${plistToModify[$change]}
Ответ №1:
Да, sed
может обрабатывать несколько файлов, независимо от того, поступают они из массива или нет, не имеет значения.
Ваш конкретный случай
В вашем конкретном примере вы можете написать
sed 'yourSedCommand' "${plistToModify[@]}"
Общий случай
sed 'cmd' file1 file2 file3
то же самое, что a=(file1 file2 file3); sed 'cmd' "${a[@]}"
. Bash расширяется "${a[@]}"
еще до sed
запуска. Для sed
нет способа определить разницу.
sed
сам по себе будет обрабатывать несколько файлов, как если бы это был один большой файл, следовательно, sed 'cmd' file1 file2 file3
это то же самое, что cat file1 file2 file3 | sed 'cmd'
.
Только если вы используете -i
флаг для редактирования файлов inplace sed -i
, будет обрабатываться несколько файлов по отдельности.
Комментарии:
1. Спасибо, это изменило ситуацию.
Ответ №2:
Неправильный тип кавычек. Расширение параметра не происходит в одинарных кавычках. Вы должны написать "${plistToModify[$change]}"
.
Комментарии:
1. Я пробовал это, без разницы. Я по-прежнему получаю ту же ошибку: синтаксическая ошибка: ожидаемый операнд (маркер ошибки «/ Users / theUser /Library / Preferences /com.apple.dock.plist»)
2. Просто будьте осторожны, чтобы избежать (префикс с) любых
$
символов в шаблоне.