2012-03-02 3 views
0

У меня есть Баш скрипт, replace.sh со следующим содержанием:Заменить скрипт работает, если я ввожу вручную, но не в сценарии

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

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

заменить .sh something somethingnew

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

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

Файлы переодеться, как и ожидалось.

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

Спасибо!

Ludo.

ответ

4

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

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

Смотрите страницу раздел Баша человека по цитируемости.

1

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

$ a=something 

$ b=somethingelse 

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

$ sed "s/$a/$b/g" testfile 
+0

Спасибо! :) 2 х правильных ответов, оба в то же время, но дал ответ другому парню, поскольку это был его первый ответ. Благодаря :) – Ludo

0

Это не относится к вашему вопросу, но какая-то помощь по использованию АСК.

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

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

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