sedまたはawkを使用して、最初の検索と2番目の検索の間にある文字列の文字を置き換えます。

sedまたはawkを使用して、最初の検索と2番目の検索の間にある文字列の文字を置き換えます。

電子メールアドレスを含むファイルでは、_(アンダースコア)を(疑問符)に置き換える必要があります。?

ファイルは次のようになります。

EFT_020034-E015133  20140624    /ACC/[email protected]         SHR    END 
EFT_020034-E015133  20140624    /ACC/[email protected]     SHR    END
EFT_020034-E015133  20140624    /ACC/[email protected]        SHR    END

予想される出力は次のとおりです。

EFT_020034-E015133  20140624    /ACC/[email protected]         SHR    END 
EFT_020034-E015133  20140624    /ACC/[email protected]     SHR    END
EFT_020034-E015133  20140624    /ACC/[email protected]        SHR    END

私はこれをどうすることができますか?sedまたはアッEMAIL+他の下線には影響せず、(定数)と(定数)の間の下線にのみ影響しますSHR。変更は新しいファイルに保存する必要があります。

答え1

awkは次のことを行います。

$ awk '{ gsub("_", "?", $3) ; print }' < data
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END
EFT_020034-E015133 20140624 /ACC/[email protected] SHR END

電子メールアドレスはフィールド3にあるため、フィールド3のみ_に置き換えます?。 1つ以上の場合を含むを_使用します。gsub

答え2

一緒にsedできること:

sed -e :1 -e 's/_\([^+]*@\)/?\1/;t1'

つまり、置換の後には文字ではなく一連_の文字が続き+、一致する文字がある限りプロセスが繰り返されます。@?

EMAIL+または、以下との間でこれを実行してくださいSHR

sed -e :1 -e 's/\(EMAIL+.*\)_\(.*SHR\)/\1?\2/;t1'

で始まる行のみを考慮したい場合は、を追加して気に入らない行を無視^EFTできます。-e '/^EFT/!b'

sed -e '/^EFT/!b' -e :1 -e 's/\(EMAIL+.*\)_\(.*SHR\)/\1?\2/;t1'

次の入力に注意してください。

EFT EMAIL+ foo_bar SHR bar_baz EMAIL+ SHR

EMAIL+両方の下線は両方ともanとaの間にあるので置き換えられますSHR

これを防ぐには、次のようにします。

sed '
  /^EFT/!b # leave the non-EFT lines alone (branch out)
  s/%/%p/g; s/</%l/g; s/>/%r/g; # escape the <>% characters with %
  s/EMAIL+/</g; s/SHR/>/g; # replace EMAIL+ and SHR with < and >
  :1
  s/\(<[^<>]*\)_\([^<>]*>\)/\1?\2/; t1
  s/</EMAIL+/g; s/>/SHR/g; # restore EMAIL+ and SHR
  s/%r/>/g; s/%l/</g; s/%p/%/g; # restore the escaped <>%'

答え3

sed '/.*EMAIL+\(.*\)SHR.*/{
    h;s//\1/;y/_/?/;G
    s/\(.*\)\n\(.*EMAIL+\).*SHR/\2\1SHR/}'

これは作業をかなり安定して行う必要があります。 1行の最後の項目と同じ行の最後の項目間のすべての項目を置き換え、両方の_文字列を含む行でのみ置き換えます。?EMAIL+SHR

関連情報