bash: Поиск / замена строк, соответствующих шаблонам в стиле $ {FOO} - PullRequest
1 голос
/ 27 марта 2012

Я создаю сценарий bash и хочу заменить "$ {PRODUCT_NAME}" на "WORD", например. Проблема в "$", в bash $ означает аргумент, поэтому, когда я запускаю скрипт

echo "Replace ${PRODUCT_NAME} with $1 in document.txt"

for file in $(grep -il ${PRODUCT_NAME} ~/Documents/tmp/document.txt)   
do   
   sed -e "s/${PRODUCT_NAME}/$3/g" $file > /tmp/tempfile.tmp   
   mv /tmp/tempfile.tmp $file   
done   

скрипт распознает $ {PRODUCT_NAME} как аргумент, а не как слово, которое я хочу заменить. Как мне заставить его признать, что "$ {PRODUCT_NAME}" является словом, а не аргументом, чтобы я мог заменить его?

1 Ответ

2 голосов
/ 27 марта 2012

Прежде всего, обратите внимание, что ваш сценарий sed на самом деле должен использовать \${PRODUCT_NAME} вместо ${PRODUCT_NAME} в качестве шаблона поиска, потому что в базовом регулярном выражении POSIX $ означает скорее "конец строки"чем «знак доллара».Это из пути.,.

В Bash вы можете либо заключить в кавычки знак доллара с обратной косой чертой:

echo "Replace \${PRODUCT_NAME} with $1 in document.txt"

for file in $(grep -il ${PRODUCT_NAME} ~/Documents/tmp/document.txt)
do
   sed -e "s/\\\${PRODUCT_NAME}/$3/g" $file > /tmp/tempfile.tmp
   mv /tmp/tempfile.tmp $file
done

, либо использовать одинарные кавычки (которые похожи на двойные кавычки, за исключением того, что они неразрешить расширение на основе $ и не обрабатывать \):

echo 'Replace ${PRODUCT_NAME} with '"$1 in document.txt"

for file in $(grep -il ${PRODUCT_NAME} ~/Documents/tmp/document.txt)
do
   sed -e 's/\${PRODUCT_NAME}/'"$3/g" $file > /tmp/tempfile.tmp
   mv /tmp/tempfile.tmp $file
done

(Кстати, намеренно ли ваша строка echo использует $1, а ваша sedстрока использует $3? Кажется, они оба должны использовать один и тот же параметр.)

...