以下の内容のファイルがあります。
/ABC/RTE/AD_900_VOP_123/OPP
/ABC/RTE/TRE/AD_900_VOP_145/BBB
/ABC/RTE/AN_900_VFP_124/FBF
/ABC/RTE/HD_900_FOP_153/WEW
/ABD/RDV/AD_900_VOP_123/OPP
/ABC/RTE/WD_900_VOP_123/GRR/TRD
/ABC/RTE/RTD/AR_900_VOP_443/SDD
このファイルで正規表現を使用して、次のような出力を取得するにはどうすればよいですか?
AD_900_VOP_123
AD_900_VOP_145
AN_900_VFP_124
HD_900_FOP_153
AD_900_VOP_123
WD_900_VOP_123
AR_900_VOP_443
Gnu grep
grep -oE '[[:alpha:]]+_[[:digit:]]+_[[:alpha:]]+_[[:digit:]]+'
Perl正規表現フラグと後読みおよび先読みアサーションを使用して、一致が/
で囲まれていることを保証します
grep -oP '(?<=/)[[:alpha:]]+_[[:digit:]]+_[[:alpha:]]+_[[:digit:]]+(?=/)'
awk
を使用する方法:
awk -F/ '{for(i=1;i<=NF;i++)$0=($i~/_/)?$i:$0}1' file
IMHO Perlは、最も簡単で最も柔軟なソリューションを提供します。
Perl -nE 'say $1 if m{/(\w+\d+\w+\d+)/};' input_file
その点に注意してください input_file
はオプションです:STDIN
は、入力ファイル名が指定されていない場合にフィルタリングされます。
sed 's|.*/\([^/]*_[^/]*\)/.*|\1|
' <<\INPUT
/ABC/RTE/AD_900_VOP_123/OPP
/ABC/RTE/TRE/AD_900_VOP_145/BBB
/ABC/RTE/AN_900_VFP_124/FBF
/ABC/RTE/HD_900_FOP_153/WEW
/ABD/RDV/AD_900_VOP_123/OPP
/ABC/RTE/WD_900_VOP_123/GRR/TRD
/ABC/RTE/RTD/AR_900_VOP_443/SDD
INPUT
これにより、行の/
文字の直前から2番目から最後までの_
が削除され、そこから次の/
までのすべてが保存され、残りが削除されます。
上記のコマンドは印刷されます...
AD_900_VOP_123
AD_900_VOP_145
AN_900_VFP_124
HD_900_FOP_153
AD_900_VOP_123
WD_900_VOP_123
AR_900_VOP_443
不要な部分はスラッシュと3文字です。
保持したい部分もスラッシュで始まり、3文字を超えていますが、3番目の文字はアンダースコアなので、/XXX
のように見えても/XX_
ではない部分をすべて削除します
これにより、保持する部分の先頭にスラッシュが残るため、最後にその1つのスラッシュも削除します。
sed 's|/..[^_]||g; s|^/||' </tmp/f1
説明:
Sedコマンドは、;
で区切られた2つのs
(代替コマンド)で構成されています。正規表現にはスラッシュが含まれているため、正規のs|...|...|
の代わりにs/.../.../
を使用します
どちらの代替コマンドでも、2番目の部分は空です。何もない代替=その部分を削除します。最初のものはグローバルにg
を使用します。つまり、置換するものがなくなるまで何度も繰り返します。
[^_]
は、アンダースコア以外のすべてに一致します。 T
これはあなたが必要なことをするはずです。
の内容 tstfile.txt
:
/ABC/RTE/AD_900_VOP_123/OPP
/ABC/RTE/TRE/AD_900_VOP_145/BBB
/ABC/RTE/AN_900_VFP_124/FBF
/ABC/RTE/HD_900_FOP_153/WEW
/ABD/RDV/AD_900_VOP_123/OPP
/ABC/RTE/WD_900_VOP_123/GRR/TRD
/ABC/RTE/RTD/AR_900_VOP_443/SDD
変換するコマンドtstfile.txt
:
$ sed 's|.*/\([0-9_A-Z]\+900[0-9_A-Z]\+\)/.*|\1|' tstfile.txt
AD_900_VOP_123
AD_900_VOP_145
AN_900_VFP_124
HD_900_FOP_153
AD_900_VOP_123
WD_900_VOP_123
AR_900_VOP_443
上記は、「900」の先頭で遭遇する最初のフォワードスラッシュまで(9の左側)、「900」の最後で最初のフォワードスラッシュまで(「最後の0)。