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

Ahd*_*dee 1 grep bash regular-expression

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

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -P -o '^H.+?_'
Run Code Online (Sandbox Code Playgroud)

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

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

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

Gil*_*not 6

像这样,使用排除字符类

$ echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -Po '^[^_]+'
Ha00030
Run Code Online (Sandbox Code Playgroud)

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

echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -o '^[^_]\+'
Run Code Online (Sandbox Code Playgroud)

意思[^_]+是除 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
Run Code Online (Sandbox Code Playgroud)

或者

$ IFS=_ read str _ <<< "Ha00030_Z6_L008_I1_001.fastq.gz"
$ echo "$str"
Ha00030
Run Code Online (Sandbox Code Playgroud)

使用cut(任何外壳)

POSIX

$ printf '%s\n' "Ha00030_Z6_L008_I1_001.fastq.gz" | cut -d'_' -f1
Ha00030
Run Code Online (Sandbox Code Playgroud)