2016-06-20 8 views
0

私はこれを解決するのに近いと感じていますが、そこにはかなり入ることはできません。Sedはbashのコメントではない行を置き換えます

ユーティリティが/etc/rc.localで呼び出されているかどうかを調べるスクリプトがあります。そうでなければ、ファイルの最後にexit 0の直前の行にそれを呼び出す行を追加したいと思います。これまでのところ、私はこの持っている:作品のこの種の

sudo sed -i 's/.*exit 0.*/'$UTILITY_PATH'\n&/' /etc/rc.local

をするだけでなく、コメントとして「出口0」で行と一致する - スクリプトがすべきことを確実にするために更なるまで/etc/rc.localユーザーへのリマインダーとして発生しますこの行で終了します。

ので、明確にするために、以下が一致する必要があります:

exit 0 
exit 0 
exit 0 

など。以下は一致しないはずです:

#exit 0 
#  exit 0 
# blah blah "exit 0" blah blah 
# exit 0 

誰かが正しい方向に向いていますか?

+0

多くのことを考えて、多くの可能な結果を​​得るには、検索をより具体的にするのが最善の方法です。1つのオプションはあなたの出口を次のようにすることです: 'exit 0';その特定の検索は – hedgehog

+0

@hedgehogです。私はファイルのフォーマットを制御できません。ユーザーが編集でき、これらの形式の出口0はすべてbashに有効です – stefandz

+1

'exit'だけではどうですか?最後のコマンドのステータス)または 'exit $((0))'または 'x = exit; $ x 0'または... –

答えて

2

私はあなたがこれをしたいと思います:

sed -r -i 's/^\s*exit\s{1,}[0-9]/foo\n&/' /etc/rc.local 

それはexit [0-9]と一致する - 前との間で、おそらく空間を有します。


ところで、あなたはまた、パターンが見つかった場合、検索やワンステップで可能な挿入はawkを使用して、両方を実行することができますGNU awk

awk '/foo/{m=1}/^\s*exit\s+[[:digit:]]/&&!m{print "foo"}1' /etc/rc.local 

新しいバージョンでも場所編集にサポートしています。

awk -i inplace '/foo/{m=1}/^\s*exit\s+[[:digit:]]/&&!m{print "foo"}1' /etc/rc.local 
+0

nahh彼が望むものははるかに複雑です.... – hedgehog

+0

これはコメントにもテキストとしても存在する可能性があることを念頭に置いておきたいので... – hedgehog

+0

これはうまくいかないようです - それはまだrc.localのコメントアウトされた "exit 0"と一致します。 – stefandz

2

これは、regular expressionsについての質問です。あなたが望むのは、#が前に付いていない限り、exit 0のマッチです。これはどうですか?

sudo sed -i 's/^[^#]*exit 0.*/'$UTILITY_PATH'\n&/' /etc/rc.local 
+2

それは 'brexit'と一致します;) – hek2mgl

+0

は本当に良いですが、hek2mglが指摘するように、brexitと一致します! – stefandz

0

車線の中央に「#」がありますか? bcaus「#」を用いると、非常に簡単な場所にある最初の印刷可能な文字の場合: 使用(ここでは非常に簡単です)1つの以上の正規表現sedの操作の範囲を決定するためには、ちょうどこのようになめらか:

sed '/^\W*#/ ! s/something_u_want/whatever_u_want/ ' /etc/rc.local 

/^\W*#/手段それだけ、このREG-EXをmathingラインに適用されますsedは、何がそうでない
と感嘆行われません条件が逆転しているので、ちょうど否定である - 今のsedは「#」から開始does notのこれらの線に適用されます

場合#isntまずは... hmmm ... maybe:

sed '/^[^#]*exit 0/ s/something_u_want/whatever_u_want/ ' /etc/rc.local 
関連する問題