
を使用して、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;&/"
答え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番目のフィールドを変更し、変更されたフィールドとともにデータを出力します。出力も;
- で区切られます。