Могу ли я указать sed массив для его пути?

#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. Просто будьте осторожны, чтобы избежать (префикс с) любых $ символов в шаблоне.