在 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 标志以及后视和前视断言来保证匹配被包围/

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

答案2

恕我直言,Perl 提供了最简单、最灵活的解决方案:

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

请注意,这input_file是可选的:STDIN如果/当未给出输入文件名时将被过滤。

答案3

一种方法是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

这将删除一行中/紧邻字符之前的倒数第二个出现的字符,保存该字符与下一个出现的 之间的所有内容,然后删除其余的字符。_/

上面的命令打印....

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

相关内容