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;&/"

答え2

を使用すると、sedパターンの3番目の項目(ここではセミコロン)のみを変更できます。

sed 's/;/;INSERTED_STRING;/3' <<<"$string"

編集する: 他の特定の文字列の前にN番目に表示される文字列を置き換えます。パターン文字列 keyword(「相対発生」、あなたの場合は2番目の発生)行がuniqe文字列と一致する場合command。 ):

sed -r '/command/ s/([^;]*;){1}keyword/INSERTED_STRING;&/' <<<"$string"

答え3

;- 区切り記号ビットをレコードフィールドとして扱う場合は、awk次のように実行できます。

$ awk -F';' -vOFS=';' -vstring="NEW TEXT" '{ $4 = $4 ";" string; print }' file
command -some -args -c 'a quoted section;some;lines;of code;NEW TEXT;keyword;more lines;etc();'

awk-F';'行を -file;区切られた複数のフィールドに分割します。その後、コードは追加の内容;と変数string(コマンドラインで定義されている)に含まれる文字列を追加して4番目のフィールドを変更し、変更されたフィールドとともにデータを出力します。出力も;- で区切られます。

関連情報