你好,我想我只想提取匹配的一个组成部分,例如直到第一个“_”
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
或者与目前所有盒子上没有的PCRE
aka相同,例如最新的:-P
freeBSD
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}
打印其中的第一个。