1

だから私はmacports経由でgsedをインストールしようとしましたが、これは問題を解決していません。混乱を減らすためにアンインストールするつもりでしたが、アンインストールする前に、以下のエラーをどのように修正しますか?これは、BSDバージョンのsed Mac OS Xが私が理解していることから実行されているためですが、私が見つけた修正はどれも役に立たないようです。

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

の「\n」が原因でこの問題が発生し$testます。それから削除\nしてみてください。

POSIX標準は、検索パターンの一部としてsedのみ受け入れます。\nOS Xは、sedPOSIXに厳密に準拠した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 に答える
1

テスト変数に、ファイルの編集に.使用できるのはあなただけを含む行が含まれていない場合:ed

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

詳細については、 http://wiki.bash-hackers.org/howto/edit-edを参照してくださいed

編集:ああ、私はあなたが実際にバックスラッシュに続いてNを持っていて、変数に文字通りの改行がないことを見逃しました。リテラル改行を使用する場合は、上記が機能するはずです。

EDIT2:コメントで与えられたペーストビンを考えて、試してみてください:

#!/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コマンドであり、実際にファイルへの変更を保存します(:wvimのように)

于 2012-08-13T16:42:51.463 に答える