挿入が必要なファイルがあります。挿入はファイル内の既存の文字列によって異なり、そのファイルのキーワードを使用して識別できます。挿入自体は特定の行に従う必要があります。私の例では、「/ここ/ ".私は通常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つの主要な式が含まれています。
KEY...something...()
一致する行が見つかると、最初の項目が実行されます。次に、現在の行を予約済みスペースに保存し、文字列の前のビットを所定のインデントに置き換えて、括弧の前にh
ビットを追加します。これにより、後で挿入する行が作成されます。その後、予約済みスペースと編集バッファーが置き換えられ、変更されていない元の行が出力されます。KEY
_Addon
x
- 行が一致すると
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*/
上記のコードは、文字列がインデントされたスペースとタブの数に関係なく、インデントされた改行を印刷します。