从匹配的 grep 字符串返回特定组件?

从匹配的 grep 字符串返回特定组件?

你好,我想我只想提取匹配的一个组成部分,例如直到第一个“_”

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -P -o '^H.+?_'

然而上面的返回,Ha00030_但我只想Ha00030

我可以做些什么,括号或其他东西来向 grep 表明我只想要匹配的某个部分?

编辑:^H 不是必需的。因此匹配第一个“_”就足够了。

答案1

像这样,使用排除字符类:

$ echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -Po '^[^_]+'
Ha00030

或者与目前所有盒子上没有的PCREaka相同,例如最新的:-PfreeBSD

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -o '^[^_]\+'

意思[^_]+是除 a 之外的所有_带有+量词的

使用

使用参数扩展替换, 看:http://mywiki.wooledge.org/BashFAQ/073和 中的“参数扩展” man bash。另请参阅http://wiki.bash-hackers.org/syntax/pe

$ str=Ha00030_Z6_L008_I1_001.fastq.gz
$ echo "${str//_*/}"
Ha00030

或者

$ IFS=_ read str _ <<< "Ha00030_Z6_L008_I1_001.fastq.gz"
$ echo "$str"
Ha00030

使用cut(任何外壳)

POSIX

$ printf '%s\n' "Ha00030_Z6_L008_I1_001.fastq.gz" | cut -d'_' -f1
Ha00030

答案2

根据您获取字符串的位置,您也许可以在不离开 shell 的情况下提取该字段:

a="Ha00030_Z6_L008_I1_001.fastq.gz"
echo "${a%%_*}"

输出

Ha00030

答案3

您还可以考虑awk,特别是如果逻辑可能变得更复杂。

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | awk -F_ '{print $1}' 

-F_意味着分割_{print $1}打印其中的第一个。

相关内容