从行中提取关键字

从行中提取关键字

我需要从下面的数据中提取类似的模式。该模式以“.”开头。或者 '' 然后是我想要的关键字,然后是 ''。我们可以假设格式是

  1. LSUFE-数字_
  2. 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/'

相关内容