web-dev-qa-db-ja.com

Unixファイルで正規表現を使用して部分文字列を抽出する

以下の内容のファイルがあります。

/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
4
g4ur4v

Gnu grep

grep -oE '[[:alpha:]]+_[[:digit:]]+_[[:alpha:]]+_[[:digit:]]+' 

Perl正規表現フラグと後読みおよび先読みアサーションを使用して、一致が/で囲まれていることを保証します

grep -oP '(?<=/)[[:alpha:]]+_[[:digit:]]+_[[:alpha:]]+_[[:digit:]]+(?=/)'
7
iruvar

awkを使用する方法:

awk -F/ '{for(i=1;i<=NF;i++)$0=($i~/_/)?$i:$0}1' file
2
jaypal singh

IMHO Perlは、最も簡単で最も柔軟なソリューションを提供します。

Perl -nE 'say $1 if m{/(\w+\d+\w+\d+)/};' input_file

その点に注意してください input_fileはオプションです:STDINは、入力ファイル名が指定されていない場合にフィルタリングされます。

2
Onlyjob
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
0
mikeserv

不要な部分はスラッシュと3文字です。

保持したい部分もスラッシュで始まり、3文字を超えていますが、3番目の文字はアンダースコアなので、/XXXのように見えても/XX_ではない部分をすべて削除します

これにより、保持する部分の先頭にスラッシュが残るため、最後にその1つのスラッシュも削除します。

sed 's|/..[^_]||g; s|^/||' </tmp/f1

説明:

Sedコマンドは、;で区切られた2つのs(代替コマンド)で構成されています。正規表現にはスラッシュが含まれているため、正規のs|...|...|の代わりにs/.../.../を使用します

どちらの代替コマンドでも、2番目の部分は空です。何もない代替=その部分を削除します。最初のものはグローバルにgを使用します。つまり、置換するものがなくなるまで何度も繰り返します。

[^_]は、アンダースコア以外のすべてに一致します。 T

0
Johan

これはあなたが必要なことをするはずです。

の内容 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)。

0
slm