1

所以我尝试通过 macports 安装 gsed 但这并没有解决问题。我打算卸载它以减少混乱,但是,在我这样做之前,我将如何修复下面的错误。这是因为我所理解的 sed Mac OS X 的 BSD 版本正在运行,但我似乎找到的修复程序都没有帮助。

sed: 1: "/\[staging: production\ ...": command i expects \ followed by text

#!/bin/bash

test="lala\nkjdsh"
sed -i -e '/\[staging: production\]/ i '$test'' ./test.txt
4

2 回答 2

1

如果测试变量不包含仅包含.您可以ed用来编辑文件的行:

printf '%s\n' '/\[staging: production\]/i' "$test" . w | ed -s ./test.txt

有关. _ _ed

编辑:哦,我错过了你的变量中实际上有反斜杠后跟 N 而不是文字换行符。如果您使用文字换行符,上述应该可以工作。

EDIT2:鉴于评论中给出的pastebin,请尝试:

#!/usr/bin/env bash
#...
ed -s ./test.txt << EOF
/\[staging: production\]/i

; some comment
someStuffHere[] = "XYZ"
someMoreStuff[] = "$someShellVar"

; another comment
.
w
EOF

一行中的.单独结束insert 命令,w是 write 命令,它实际上将更改保存到文件中,(就像:w在 vim 中一样)

于 2012-08-13T16:42:51.463 回答
1

你有这个问题是因为$test. 尝试从中删除\n

POSIX 标准sed仅接受\n作为搜索模式的一部分。OS X 使用sed严格符合 POSIX的 FreeBSD

因此,如果您需要在变量中添加换行符,则需要编写如下内容:

$ test="lala\
> kjdsh"

你也可以用 perl 解决这个任务:

$ test="lala\nkjdsh"
$ perl -n -i -e 'print "'"$test"'\n" if /\[staging: production\]/; print;' ./test.txt

例子:

$ echo '[staging: production]' > /tmp/test.txt
$ test="lala\nkjdsh"
$ perl -n -i -e 'print "'"$test"'\n" if /\[staging: production\]/; print;' ./test.txt
$ cat ./test.txt
lala
kjdsh
[staging: production]
于 2012-08-13T16:27:55.670 回答