我有以下文字:
/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”之前匹配所有内容。
例如:
等
我该怎么做?
答案 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