我需要从下面的数据中提取类似的模式。该模式以“.”开头。或者 '' 然后是我想要的关键字,然后是 ''。我们可以假设格式是
- LSUFE-数字_
- PCRF-数字_
样本数据
/home/mobaxterm/Data/FW/FW3/FW.3.1/releases/patch_PCRF-17717B1.jar,patch_PCRF-17717B1.jar,yschew,2015-10-21 11:31:58.000000000,patch
/home/mobaxterm/Data/FW/FW9/CW.1/releases/D/patch_FW_9.3.1.LSUFE-583B1_i86pc.jar,patch_FW_9.3.1.LSUFE-583B1_i86pc.jar,yschew,2015-10-21 11:31:58.000000000,patch,i86pc
所需输出
LSUFE-583B1
PCRF-17717B1
我尝试过使用来自的答案 https://stackoverflow.com/questions/8777901/extract-specific-words-from-a-line
sed -r 's/.*LSUFE-(\S+).*/\1/'
但它不起作用,我得到的只是一个空白屏幕。现在我正在想做类似的事情
sed -e 's/LSUFE-*/,/\_/' output.txt
但当然,我没有让它工作,我的想法是对每个模式进行一一处理,从匹配的模式中读取,直到遇到下划线。
答案1
你可以使用这样的东西:
$ grep -oE '(LSUFE|PCRF)-[^._]*' input.txt | uniq
PCRF-17717B1
LSUFE-583B1
这uniq
是必需的,因为每一行都包含补丁文件名的完整路径和基本名称(即没有路径)。
或者,如果输出的顺序无关紧要,您可以使用sort -u
而不是uniq
- 这也将消除输入的多行上出现的任何重复项。
这是 perl 中的另一种选择:
perl -F, -a -e 'next unless $F[1] =~ s/.*((LSUFE|PCRF)-[^._]*).*/$1/ ; print $F[1],"\n"' input.txt
这仅对字段 2 执行正则表达式搜索和替换($F[1]
在 perl 中,因为 perl 数组是从零开始的),然后打印字段 2。
此 Perl 版本将匹配文本作为额外字段附加到输入行的末尾:
perl -F, -a -e 'chomp ; next unless $F[1] =~ s/.*((LSUFE|PCRF)-[^._]*).*/$1/ ; print $_,",",$F[1],"\n"' input.txt
它用于从输入行中chomp()
去除尾随\n
,然后打印输入行 ( $_
)、逗号、修改的字段 2 和换行符。
答案2
仅捕获的信息
sed 's/.*\(LSUFE-\([^_.]*\)[_.].*/\1/' YourFile
捕获添加到末尾,
作为分隔符
sed 's/.*\(LSUFE-\([^_.]*\)[_.].*/&,\1/' YourFile
一次有多个图案
sed -e 's/.*\(LSUFE-\([^_.]*\)[_.].*/\1/' -e 's/.*\(PCRF-\([^_.]*\)[_.].*/\1/' YourFile
使用 GNU sed
sed 's/.*\(\(LSUFE\|PCRD\)-\([^_.]*\)[_.].*/\1/'