2013-08-20 5 views
0

Привет Я пытаюсь использовать Sed в скрипте Bash, и у меня возникла проблема. (Я новичок в них обоих)Вставка переменной после шаблона с помощью sed

Я пытаюсь вставить $log после флага <!-- Beginning git log -->.

#!/bin/bash 
log=`git log -1 --stat --date=short --pretty=format:'[ %cd | %an | %s ]'` 
sed "/<!-- Beginning git log -->/a $log" ~/opt/prime.dropbox/commit.md 

Так в commit.md я бы:

some text 
<!-- Beginning git log --> 
git log output 
some text 

Я перепробовал все возможные одиночные/двойные кавычки трюки, .. или, может быть, только все неправильные.

Это ошибка, которую я получаю большую часть времени.

sed: -e expression #1, char 102: unknown command: `f' 

Я знаю, что с awk должен быть более простой способ, но я так близко. ^^

Возможно, есть Html-символы <!-- --> блокирование или что-то в этом роде?

Thx

+0

Возможно, выход 'git log' содержит символы, специальные для sed. Каково значение '$ log'? –

+0

[2013-08-20 | sergio | git log без -p] index.html | 2 + - 1 файл изменен, 1 вставка (+), 1 удаление (-) Да, похоже. Но я не хочу, чтобы sed интерпретировал это. –

ответ

0

СЭД является отличным инструментом для простых замен на одной линии, но для чего-либо еще, просто используйте awk:

awk -v gitlog="$log" '{print} /<!-- Beginning git log -->/{print gitlog}' ~/opt/prime.dropbox/commit.md 

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

the_command orig_file > /usr/tmp/tmp$$ && mv /usr/tmp/tmp$$ orig_file 

В этом случае:

awk -v gitlog="$log" '{print} /<!-- Beginning git log -->/{print gitlog}' ~/opt/prime.dropbox/commit.md > /usr/tmp/tmp$$ && 
mv /usr/tmp/tmp$$ ~/opt/prime.dropbox/commit.md 

временный файл может находиться в рабочем каталоге или в вашем домашнем доме или в/usr/tmp или где угодно, и вы можете назвать все, что захотите.

+0

ок спасибо, но он бросает мне «немного» ошибка: AWK: запустить ошибки времени: не командная строка правопреемником войти \t типа столкновения или ключевое слово \t FILENAME = «» FNR = 0 NR = 0 –

+0

О господи. 'log' - зарезервированная переменная ... Может быть, это сработает даже в sed. Большое спасибо ! –

+0

Нет, эта ошибка исходит от awk, это не связано с sed. 'log' - это имя awk-функции, поэтому вы не можете использовать его как имя переменной awk. Я должен был это заметить. Я обновил свой ответ. –

0

Вы должны избежать ! с \:

sed "/<\!-- Beginning git log -->/a $log" ~/opt/prime.dropbox/commit.md 
+0

Я пробовал, и проблема стоит на месте. thx anyway –

+1

Не нужно будет скрывать '!' внутри скрипта, только при интерактивном запуске bash. –

0

работает для меня:

$ cat in.txt 
some text 
<!-- Beginning git log --> 
git log output 
some text 
$ echo $log 
[ 2013-08-20 | sergio | git log without -p ] index.html | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) Yes it looks like. 
$ sed "/<\!-- Beginning git log -->/a $log" in.txt 
some text 
<!-- Beginning git log --> 
[ 2013-08-20 | sergio | git log without -p ] index.html | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) Yes it looks like. 
git log output 
some text 
+1

Lol, да, это работает, когда я непосредственно набираю вывод 'git log', а не $ log .. так ... WTF! –

Смежные вопросы