1

嗨,我尝试在 Bash 脚本中使用 Sed,但遇到了问题。(我对他们俩都是新手)

我试图$log在 flag 之后插入<!-- 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 字符<!-- -->阻塞或什么?

谢谢

4

3 回答 3

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
于 2013-08-20T10:31:43.840 回答
0

你需要逃避!with \

sed "/<\!-- Beginning git log -->/a $log" ~/opt/prime.dropbox/commit.md
于 2013-08-20T10:21:10.823 回答
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 或您想要的任何位置,并且可以任意命名。

于 2013-08-20T10:54:50.970 回答