正则表达式在第二次出现特殊字符

时间:2015-07-29 15:36:30

标签: regex bash

我有以下文字:

/sources/x1/y1/CLD_strict_AccountsMatchfile_feed_2015062405.txt
/sources/x1/y1/CLD_strict_AdGroupMatchFile_feed_2015062405.txt
/sources/x1/y1/CLD_strict_AdsMatchfile_feed_2015062405.txt
/sources/x1/y1/CLD_strict_AdvertisersMatchfile_feed_2015062405.txt
/sources/x1/y1/CLD_strict_AudienceMatchFile_feed_2015062405.txt

并希望在使用bash的第二个“_”之后和“Matchfile”之前匹配所有内容。

例如:

    第1行
  • 我想选择“帐户”
  • 第2行我想选择广告组

我该怎么做?

5 个答案:

答案 0 :(得分:4)

因为你问过如何使用bash做到这一点: (1)将删除Matchfile之后的所有内容,(1)将删除最后一个下划线之前的所有内容。所以你可以遍历文本,如:

${line%%Match[Ff]ile*}

答案 1 :(得分:2)

如果你没有注意到其中一些有Matchfile和一些MatchFile,假设枯萎适用于你希望匹配以下perl的组的末尾一个衬垫将起作用

perl -pe 's/^.*_.*_(.*)Match[Ff]ile.*$/$1/'

例如

find /sources/x1/y1/ -type f -name "*.txt" |  perl -pe 's/^.*_.*_(.*)Match[Ff]ile.*$/$1/'

将打印

Accounts
AdGroup
Ads
Advertisers
Audience

(如果以上是该目录中唯一以.txt结尾的文件)

答案 2 :(得分:2)

cut -d'_' -f2- text-file | grep -oP "(?<=_).*(?=Match[Ff]ile)"

这使用lookbehind和lookahead regex来查找但不匹配括号中的内容。

答案 3 :(得分:2)

使用sed:

cat filename|sed 's/^[^_]\+_[^_]\+_\(.*\)Match[fF]ile.*/\1/g'

或使用grep(在linux上,grep支持-P和-o)

cat filename|grep -o -P "^[^_]+_[^_]+_\K(.*)(?=Match[fF]ile)"

答案 4 :(得分:1)

使用awk

可以轻松完成此操作
awk -F 'Match[Ff]ile|_' '{print $3}' file
Accounts
AdGroup
Ads
Advertisers
Audience