を使用して、sed
特定の文字列の前(または後)に表示される文字の後にテキストを挿入する方法ですN
。たとえば、編集するテキスト行が次のようになるとします。
command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'
テキストファイルでこの行を見つけた後(おそらく一意の文字列を介してcommand
)、その前の2番目の(N = 2)セミコロンの後にテキストを挿入したいと思いますkeyword
(たとえば、セミコロンで区切られたlines
sumなどof
)。特にsed
こんな用途に使いたいです。
例を続けると、予想される出力は次のようになります。
command -some -args -c 'a quoted section;some;lines;INSERTED_STRING;of code;keyword;more lines;etc();'
これはINSERTED_STRING;
(例えばシェル変数を介してsedに提供される)所望の位置に挿入される。
ベストアンサー1
私は単純なものを好みます:
sed '/command/s/[^;]*;keyword/INSERTED_STRING;&/'
キーワードの前に2つのフィールドを挿入します。一般的な解決策は
sed "/command/s/\([^;]*;\)\{$N\}keyword/INSERTED_STRING;&/"
しかし、N
あなたの質問に比べてオフセットは1:ここでは、N=2
挿入との間に2つのフィールドがあることを意味しますkeyword
。
説明:/command/
ある行のみが選択されたため、command
他の行は変更されません。([^;]*;\)
次のセミコロン(非セミコロンシーケンス)を含むフィールドと一致します。その後に\{$N\}
パターン一致フィールドを追加します$N
。以下は、前のフィールドと同様に、keyword
この一致を完了します。置換パターンは挿入された文字列で構成され、一致するすべての項目に置き換えられます(したがって、最終的に置換ではなく挿入になります)。keyword
$N
&
拡張正規表現を使用すると、短くて読みやすいです。
sed -E "/command/s/([^;]*;){$N}keyword/INSERTED_STRING;&/"