テキストの行を一致するテキストに置き換える

テキストの行を一致するテキストに置き換える

オリジナルファイル

123|abc|heloo good morning friends|1|123|abc|123|abc
123|abc|heloo good morning everyone|1|123|abc|123|abc

置き換えられたファイル

123|abc|heloo good morning freinds|1|123|abc|123|abc
123|abc|this is what i want to see|1|123|abc|123|abc

ご覧のとおり、区切り記号はです|。ブロックに「Everyone」という単語が含まれている場合は、その特定のブロックを「私が見たいものは次のとおりです」に変更する必要があります。

答え1

フィールドを繰り返しながら一致することを確認してください。

awk 'BEGIN{FS=OFS="|"}
     {for (i=1; i<=NF; i++)
           if ($i ~ "everyone") $i="this is what i want to see"
      print}' file

出力を表示します。

$ awk 'BEGIN{FS=OFS="|"} {for (i=1; i<=NF; i++) if ($i ~ "everyone") $i="this is what i want to see"; print}' file
123|abc|heloo good morning friends|1|123|abc|123|abc
123|abc|this is what i want to see|1|123|abc|123|abc

より慣用的な方法でif条件を次のように作成し、実際の($i ~ "everyone") && $i="this is what i want to see"条件を使用してその行を印刷できます。

awk 'BEGIN{FS=OFS="|"} {for (i=1; i<=NF; i++) ($i ~ "everyone") && $i="this is what i want to see"} 1' file

答え2

sed 's/[^|]*everyone[^|]*/this is what I want to see/g' <<\DATA
123|abc|heloo good morning friends|1|123|abc|123|abc                       
123|abc|heloo good morning everyone|1|123|abc|123|abc
DATA

出力

123|abc|heloo good morning friends|1|123|abc|123|abc
123|abc|this is what I want to see|1|123|abc|123|abc

これは次の項目と一致します。みんな区切り文字を除いて、左右のフルシーケンス|。したがって、上記の方法が機能します。しかしそれはまた本当である:

sed 's/[^|]*everyone[^|]*/replace/g' <<\DATA
everyone|everyevery|every|one|                                             
everyone|everyone|heloo good morning everyone|everyone|123|abc|123|abc
DATA

出力

replace|everyevery|every|one|
replace|replace|replace|replace|123|abc|123|abc

関連情報