sed:指定された文字列の前後のN番目の文字の後にテキストを挿入します。

sed:指定された文字列の前後のN番目の文字の後にテキストを挿入します。

を使用して、sed特定の文字列の前(または後)に表示される文字の後にテキストを挿入する方法ですN。たとえば、編集するテキスト行が次のようになるとします。

command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'

テキストファイルでこの行を見つけた後(おそらく一意の文字列を介してcommand)、その前の2番目の(N = 2)セミコロンの後にテキストを挿入したいと思いますkeyword(たとえば、セミコロンで区切られたlinessumなど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;&/"

おすすめ記事