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 不是必需的。所以匹配第一个“_”就足够了。
$ echo "Ha00030_Z6_L008_I1_001.fastq.gz" | grep -Po '^[^_]+'
Ha00030
Run Code Online (Sandbox Code Playgroud)
或者与目前所有盒子上没有的PCRE
aka相同,例如最新的:-P
freeBSD
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)