Perl排除带模式的单词

wqlqzqxt  于 2023-03-13  发布在  Perl
关注(0)|答案(6)|浏览(125)

我有一个包含很多字符串的Filename,但我只需要剪切特定的名称,并从字符串中排除其他垃圾
文件示例:

FAILED, see /release/jenkins/workspace/Build/RELEASE/logs/component.jdfmfh_value_javac10+.log
FAILED, see /release/jenkins/workspace/Build/RELEASE/logs/component.jadxfh_value_javac10+.log
FAILED, see /release/jenkins/workspace/Build/RELEASE/logs/component_value_javac10+.log
FAILED, see /release/jenkins/workspace/Build/RELEASE/logs/component_value_javac10+.log
FAILED, see /release/jenkins/workspace/Build/RELEASE/logs/component.jdfmfh_value_javac10+.log

因此,我需要得到如下结果:

component.jdfmfh
component.jadxfh
component
component
component.jdfmfh

我写了一个小的perl表达式,得到了接近的结果,但是我不知道如何从那里排除所有的_value_javac10+.log行。

perl -pe 's/^.*\/logs\///;' Filename

另外,如果有一种方法可以通过sed来实现,那对我来说也是可行的

iswrvxsc

iswrvxsc1#

使用任何sed:

$ sed 's:.*/logs/\([^_]*\).*:\1:' file
component.jdfmfh
component.jadxfh
component
component
component.jdfmfh

如果你的输入中有任何行与该正则表达式不匹配,所以你不想打印,然后调整它:

sed -n 's:.*/logs/\([^_]*\).*:\1:p' file
s1ag04yj

s1ag04yj2#

使用sed

$ sed 's~.*/\|_.*~~g' input_file
component.jdfmfh
component.jadxfh
component
component
component.jdfmfh
lmvvr0a8

lmvvr0a83#

要同时删除最后一个零件,您需要匹配所有零件,只保留所需的零件:

perl -pe 's/^.*logs\/([^_]*)_.*/$1/'

()中的部分将是您仍然想要的部分,输出$1。

k2fxgqgv

k2fxgqgv4#

如前所述,您的目标Perl解决方案是

perl -pe's{^.*/logs/([^_]*).*}{$1}'

但你也可以用
x一个一个一个一个x一个一个二个一个x一个一个三个一个

c7rzv4ha

c7rzv4ha5#

我将按照以下方式利用GNU AWK完成此任务,让file.txt内容

FAILED, see /release/jenkins/workspace/Build/RELEASE/logs/component.jdfmfh_value_javac10+.log
FAILED, see /release/jenkins/workspace/Build/RELEASE/logs/component.jadxfh_value_javac10+.log
FAILED, see /release/jenkins/workspace/Build/RELEASE/logs/component_value_javac10+.log
FAILED, see /release/jenkins/workspace/Build/RELEASE/logs/component_value_javac10+.log
FAILED, see /release/jenkins/workspace/Build/RELEASE/logs/component.jdfmfh_value_javac10+.log

那么

awk 'BEGIN{FS="/"}{sub(/_.*/,"",$NF);print $NF}' file.txt

给出输出

component.jdfmfh
component.jadxfh
component
component
component.jdfmfh

说明:我通知GNU AWK字段分隔符(FS)是斜线,然后对于每一行,我在最后一个字段($NF)中使用空字符串替换_和所有后续字符(即删除它们),然后print表示字段。

  • (在GNU Awk 5.0.1中测试)*
snz8szmq

snz8szmq6#

请使用您展示的样品尝试以下解决方案。

***第一个解决方案:***使用GNU awk及其match函数,该函数将捕获组创建到数组arr中,并根据要求打印其第一项。

awk 'match($0,/.*\/([^_]*)_/,arr){print arr[1]}'  Input_file

***第二个解决方案:***此处使用GNU grep和regex来获得所需的输出。

grep -oP '^.*\/\K[^_]*'  Input_file

***第三种解决方案:***使用字段分隔符/,使用_拆分最后一个字段,并根据需要的输出打印数组的第一个元素。

awk -F'/' 'split($NF,arr,"_"){print arr[1]}'  Input_file

相关问题