Почему sed не работает в моем скрипте bash? - PullRequest
5 голосов
/ 17 февраля 2012

Вот мой код. Я просто хочу скопировать некоторые файлы и заменить строку в моем Makefile. Параметр $ 1 - это просто имя моего нового файла .tex.

#!/bin/bash                                
pwd="./"                                   
tex=".tex"                                 
pwd=$1$tex                                 
cp ~/TeX/matt.sty .                        
cp ~/TeX/mon.tex $pwd                      
cp ~/TeX/Makefile .                        

sed="sed 's/mon.tex/"$1$tex"/g' Makefile > Makefile"           
$sed

У меня следующая ошибка: sed: 1: "'s/mon.tex/salut.tex/g'": invalid command code '

ps: я использую sed в Mac OS X. (так что это bsd sed)

Ответы [ 4 ]

6 голосов
/ 17 февраля 2012

Первым аргументом для sed является буквально 's/mon.tex/"$1$tex"/g' (с одинарными кавычками). очевидно, что sed не может разобрать это как команду.

Удаление одинарных кавычек решило бы эту проблему, но перенаправление (>) по-прежнему не будет работать.

Просто запустите команду sed напрямую (какой смысл в переменной $sed? Я не понимаю)

Примечание: чтобы изменить файл с помощью sed, используйте sed -i. Перенаправление на тот же файл, который вы обрабатываете, не будет работать.

0 голосов
/ 17 февраля 2012

Вы говорите

sed="sed 's/mon.tex/"$1$tex"/g'"  

, которая создает переменную sed, содержащую строку sed 's/mon.text/foo.tex/g', предполагая, что $1 равно foo ради примера.

Затем вы расширяете $sed без кавычек, и оно становится

sed ''\''s/mon.tex/foo.tex/g'\'''

Который включает в себя буквальный ' в начале вашего выражения, как если бы вы сказали:

sed -e \''s///' 

РЕДАКТИРОВАТЬ: повторюсь, ваша проблема в том, что вы напрасно цитируете выражение sed внутри присваивания переменной. Используйте

sed="sed s/mon.tex/$1$tex/g Makefile > Makefile"

И все будет работать как положено.

0 голосов
/ 17 февраля 2012

Вы удвоили командную строку sed:

sed="sed 's/mon.tex/"$1$tex"/g'"           

создает переменную sed. Затем вы используете эту переменную в качестве команды:

$sed s/mon.tex$1$tex/g Makefile > Makefile     
^^^^---here

, которая эффективно делает вашу командную строку:

sed 's/mon.tex/"$1$tex"/g' s/mon.tex$1$tex/g Makefile > Makefile
^^^^^^^^^^^^^^^^^^^^^^^^^^--var   
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--- excess args

и теперь я вижу, что ваш вопрос был отредактирован, чтобы удалить это ... так что игнорируйте это, я думаю.

0 голосов
/ 17 февраля 2012

Сообщение об ошибке вызвано ' (одинарная кавычка).
И, ' не является допустимой командой sed.

Пример:

$ echo="echo 'hello, world'"
$ $echo
'hello, world'

Вы можете использовать команду eval, чтобы Quote Removal далее больше:

sed="sed 's/mon.tex/"$1$tex"/g' Makefile > Makefile.new"          
eval $sed

Примечание:

  1. >Makefile сделает ваш оригинал Makefile пустым! Так что измените его на Makefile.new.
  2. eval это зло. Попробуйте использовать sed напрямую!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...