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

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

答え1

Gnu grep

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

Perl-regex フラグと Lookbehind と Lookahead アサーションを使用して、一致が角かっこで囲まれていることを確認します。/

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

答え2

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

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

これはinput_fileオプションです。STDIN入力ファイル名が指定されていない場合はフィルタリングされます。

答え3

1つの方法は次のとおりですawk

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

答え4

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

関連情報