使用sed在模式后插入变量

时间:2013-08-20 09:55:27

标签: bash unix sed awk

您好我尝试在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

3 个答案:

答案 0 :(得分:0)

您需要使用!转义\

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

答案 1 :(得分: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

答案 2 :(得分:0)

sed是单行简单替换的绝佳工具,但对于其他任何东西,只需使用awk:

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

在shell中运行命令并使用该命令输出安全地覆盖原始文件:

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

临时文件可以位于您的工作目录中,也可以位于$ HOME或/ usr / tmp中,也可以位于您想要的任何位置,并且可以根据需要进行命名。