電子メールアドレスを含むファイルでは、_
(アンダースコア)を(疑問符)に置き換える必要があります。?
ファイルは次のようになります。
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