bashを介して挿入されたテンプレートに変更文字列を使用する

bashを介して挿入されたテンプレートに変更文字列を使用する

挿入が必要なファイルがあります。挿入はファイル内の既存の文字列によって異なり、そのファイルのキーワードを使用して識別できます。挿入自体は特定の行に従う必要があります。私の例では、「/ここ/ ".私は通常bashを使用していないので、少し無気力です。

挿入部分は機能しますが、選択部分ではないすべての項目に対してのみ機能します。

sed -i -e '/ここ/a HelloWorld' $path

sed -e /。キー(。)()/\1/'

現在のファイル:

hello_world_12353_KEY_HalloWelt_1_2_3()
{

   ...

   /*HERE*/
}

abcdefg_KEY_HalloHaus_8_2_3()
{

    ...

   /*HERE*/
}

望ましい結果:

hello_world_12353_KEY_HalloWelt_1_2_3()
{

   ...

   /*HERE*/
   KEY_HalloWelt_1_2_3_Addon()
}

abcdefg_KEY_HalloHaus_8_2_3()
{

   ...

   /*HERE*/
   KEY_HalloHaus_8_2_3_Addon()
 }

答え1

$ sed -e '/.*KEY\(.*\)()/ { h; s//   KEY\1_Addon()/; x; }' -e '/HERE/ G' file
hello_world_12353_KEY_HalloWelt_1_2_3()
{

   ...

   /*HERE*/
   KEY_HalloWelt_1_2_3_Addon()
}

abcdefg_KEY_HalloHaus_8_2_3()
{

    ...

   /*HERE*/
   KEY_HalloHaus_8_2_3_Addon()
}

このsedコマンドには2つの主要な式が含まれています。

  1. KEY...something...()一致する行が見つかると、最初の項目が実行されます。次に、現在の行を予約済みスペースに保存し、文字列の前のビットを所定のインデントに置き換えて、括弧の前にhビットを追加します。これにより、後で挿入する行が作成されます。その後、予約済みスペースと編集バッファーが置き換えられ、変更されていない元の行が出力されます。KEY_Addonx
  2. 行が一致するとHERE(これまたは同様のより正確なパターンに変更できます\,/\*HERE\*,)、予約済みスペースの現在の内容は改行文字を区切り文字として編集Gバッファに追加されます。

答え2

awkを使用してください。

$ awk '
    { print }
    match($0,/KEY.*\(/) { new=substr($0,RSTART,RLENGTH-1) "_Addon()" }
    sub(/\/\*HERE\*\/.*/,"") { print $0 new }
' file
hello_world_12353_KEY_HalloWelt_1_2_3()
{

   ...

   /*HERE*/
   KEY_HalloWelt_1_2_3_Addon()
}

abcdefg_KEY_HalloHaus_8_2_3()
{

    ...

   /*HERE*/
   KEY_HalloHaus_8_2_3_Addon()
}

/*HERE*/上記のコードは、文字列がインデントされたスペースとタブの数に関係なく、インデントされた改行を印刷します。

関連情報