unix 使用sed在模式后插入变量

ulmd4ohb  于 2022-11-23  发布在  Unix
关注(0)|答案(4)|浏览(178)

嗨,我尝试在Bash脚本中使用Sed,但遇到了一个问题。(我对这两个脚本都是新手)
我尝试在标志<!-- Beginning git log -->之后插入$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

因此,在www.example.com中commit.md我将输入:

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

我已经尝试了所有可能的单/双引号技巧,..或者也许只有所有错误的。
这是我经常遇到的错误。

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

我知道awk应该有更简单的方法,但我已经很接近了。
也许是Html字符<!-- -->阻塞了什么?
谢谢

2g32fytz

2g32fytz1#

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或任何您想要的位置,并且可以随意命名。

uwopmtnx

uwopmtnx2#

你需要用\来逃避!

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

yk9xbfzb3#

适合我:

$ 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
gg0vcinb

gg0vcinb4#

遇到了一个类似的问题,你和以下工作对我来说。
已使用示例数据初始化日志变量和commit.md:

$ log=`git log -1 --stat --date=short --pretty=format:'[ %cd | %an | %s ]'`
$ echo "$log"
[ 2021-02-19 | My Test | docs: update light-baseimage links ]
 image/Dockerfile                             | 6 +++---
 image/service/test/schema.sh                | 2 +-
 image/service/test/process.sh               | 2 +-
 image/service/test/startup.sh               | 4 ++--
 4 files changed, 7 insertions(+), 7 deletions(-)
$ cat commit.md 
some text
<!-- Beginning git log -->
git log output
some text

我无法让sed“a”(append text)命令在一个合理的sed one liner上工作,因为它不会转义变量上的换行符。因此,多行字符串变量将以一个长行结束,并用空格替换换行符。例如:

$ sed '/<!-- Beginning git log -->/a '"$(echo $log)"'' commit.md
some text
<!-- Beginning git log -->
[ 2021-02-19 | My Test | docs: update light-baseimage links ] image/Dockerfile | 6 +++--- image/service/test/schema.sh | 2 +- image/service/test/process.sh | 2 +- image/service/test/startup.sh | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-)
git log output
some text

但是我可以使用sed“r”(append text read from filename)命令并将变量当作文件来处理,这样多行字符串变量就可以正确地打印换行符。
解决方法:

$ sed '/<!-- Beginning git log -->/r /dev/stdin' commit.md <<< "$log"

这将输出:

some text
<!-- Beginning git log -->
[ 2021-02-19 | My Test | docs: update light-baseimage links ]
 image/Dockerfile                             | 6 +++---
 image/service/test/schema.sh                | 2 +-
 image/service/test/process.sh               | 2 +-
 image/service/test/startup.sh               | 4 ++--
 4 files changed, 7 insertions(+), 7 deletions(-)
git log output
some text

或者,如果您希望在www.example.com上进行更改commit.md,请将-i标志添加到sed,如下所示:

$ sed -i '/<!-- Beginning git log -->/r /dev/stdin' commit.md <<< "$log"

输出量:

$ cat commit.md 
some text
<!-- Beginning git log -->
[ 2021-02-19 | My Test | docs: update light-baseimage links ]
 image/Dockerfile                             | 6 +++---
 image/service/test/schema.sh                | 2 +-
 image/service/test/process.sh               | 2 +-
 image/service/test/startup.sh               | 4 ++--
 4 files changed, 7 insertions(+), 7 deletions(-)
git log output
some text

相关问题