Замена скрипта работает, если я набираю вручную, но не в скрипте - PullRequest
0 голосов
/ 02 марта 2012

У меня есть скрипт bash, replace.sh со следующим содержимым:

ack-grep -a -l -i --print0 --text "$1" | xargs -0 -n 1 sed -i -e 's/$1/$2/g'

Когда я пытаюсь запустить его как, например:

replace.sh что-то новое

Приглашение возвращается без ошибок, но в файлы не было внесено никаких изменений. Если я вручную наберу:

ack-grep -a -l -i --print0 --text "something" | xargs -0 -n 1 sed -i -e 's/something/somethingelse/g'

Файлы меняются, как и ожидалось.

Синтаксис $ 1, похоже, работает для других написанных мной скриптов. Я предполагаю, что мне не хватает чего-то связанного с побегом из арг или что-то в этом роде?

Спасибо!

Людо.

Ответы [ 3 ]

4 голосов
/ 02 марта 2012

Подстановки переменных не заключаются в одинарные кавычки, попробуйте:

ack-grep -a -l -i --print0 --text "$1" | xargs -0 -n 1 sed -i -e "s/$1/$2/g"

См. Раздел справочной страницы bash на QUOTING.

1 голос
/ 02 марта 2012

Используйте "" вместо '' в выражении sed. Это не помешает разрешению имени переменной. То, что вы фактически делаете сейчас, заменяет $1 на $2. Вы можете протестировать в консоли (без написания скрипта) так:

$ a=something

$ b=somethingelse

$ sed 's/$a/$b/g' testfile

$ sed "s/$a/$b/g" testfile
0 голосов
/ 05 июня 2012

Это не относится к вашему вопросу, но помогает при использовании ack.

-a и --text конфликтуют друг с другом. -a даст вам расширенный набор --text. Используйте один или другой.

Кроме того, похоже, что вы могли бы также использовать grep -Z вместо ack, поскольку вы не используете какую-либо функциональность ack, которая является расширенной частью grep.

В общем, если вы используете ack в конвейере, вам, вероятно, следует использовать хороший старый grep.

...