-1

私の最初の問題は、構成ファイルの特定のブロックの最後に行を追加できることでした。

############
# MY BLOCK #
############
VALUE1 = XXXXX
VALUE2 = YYYYY
MYNEWVALUE = XXXXX      <<< I want to add this one

##############
# MY BLOCK 2 #
##############

これを行うために、次の sed スクリプトを使用しましたが、問題なく動作します (別の投稿で見つかりました)。

sed -i -e "/# MY BLOCK #/{:a;n;/^$/!ba;i\MYNEWVALUE = XXXXX" -e '}' myfile

これは、シェルスクリプト内で実行すると完全に機能しましたが、対話型シェルで直接使用することはできません (「!ba イベントが見つかりません」というエラーが発生しました)。これを解決するために、「!ba」の前に「\」を追加しようとしましたが、「\」が不明なコマンドであることを示す別のエラーが表示されました。

上記の問題のどこに私の間違いがあり、このスクリプトがどのように機能するかを誰か説明してもらえますか?

ここに私の理解があります:

-i : insert new line (i think the first one is useless, am i right?)
-e : execute this sed script (don't understand why there is a second one at the end to close the })
:a : begin a loop
n : read each line with the pattern ^$ (empty lines)
! : reverse the loop
ba : end of the loop

ありがとう !

4

3 に答える 3

1

'の代わりに使用"して、bash が履歴置換を試みないようにします。!

シェル パラメータの展開などが含まれている場合XXXXXは、次のように実行できます。

sed -i -e"/# $BLOCK_NAME"'#/{:a;n;/^$/!ba;i\'"$NEW_VAR = $NEW_VALUE" -e"}" myfile

2 つ目-eは、改行を効果的に挿入してiコマンドを終了するために必要です。代わりに、実際には改行を直接挿入できます。

sed -i -e"/# $BLOCK_NAME "'#/{:a;n;/^$/!ba;i\'"$NEW_VAR = $NEW_VALUE"$'\n}' myfile
于 2013-06-25T19:26:36.183 に答える
0
  • :aという名前のラベルを導入しaます。
  • n現在のパターン スペースを出力に書き込み、パターン スペースを入力の次の行に置き換えます。
  • /^$/!パターン スペース内の空白行ではない行( )に一致することを意味します。!以下baは、その一致 (空白行ではない) が発生した場合の「ラベル a への分岐」です。
  • 分岐が発生しない場合は、i挿入が行われます。

コマンド ラインで二重引用符 (") の代わりに単一引用符 (') を使用して、シェルがシェル置換 ("$" および "!" 文字を含む) を実行しないようにします。

于 2013-06-25T19:34:08.527 に答える
0

インタラクティブ シェルで!は、履歴置換に使用されるため、エスケープする必要があります。

sed -i -e "/# MY BLOCK #/{:a;n;/^\$/\!ba;i\MYNEWVALUE = XXXXX" -e '}' myfile

もエスケープする必要があります$。これは、二重引用符で囲まれた文字列内で特別な意味を持つためです (ただし、この場合/は変数名ではなく が続くため、問題ありません)。

于 2013-06-25T19:35:24.317 に答える