我需要编辑以下字符串
UA399_GTTTCG_L002_R1_001.file.gz
到
UA399_GTTTCG_L002
我尝试了sed 's/^\(.*\)_.*/\1/'
,但产生了
UA399_GTTTCG_L002_R1
有人可以帮忙吗?
答案 0 :(得分:1)
您可以像这样使用sed
或awk
或cut
,
s='UA399_GTTTCG_L002_R1_001.file.gz'
awk -F'_' '{print $1"_"$2"_"$3}' <<< "$s"
sed 's/^\([^_]*\(_[^_]*\)\{2\}\).*/\1/' <<< "$s"
cut -d_ -f1,2,3 <<< "$s"
请参见online demo。在这两种情况下,结果均为UA399_GTTTCG_L002
。
sed
详细信息
^
-一行的开头\([^_]*\(_[^_]*\)\{2\}\)
-捕获第1组匹配项:
[^_]*
-除_
以外的0多个字符\(_[^_]*\)\{2\}
-两次连续出现(\{2\}
):
_
-下划线[^_]*
-除_
以外的0多个字符.*
-该行的其余部分。替换只是包含第1组文本的占位符。
awk
详细信息
-F'_'
将记录拆分为下划线分隔的字段print $1"_"$2"_"$3
仅打印第一,第二和第三字段,并用_
字符将它们连接起来。 cut
详细信息
-d_
将字段定界符设置为_
char -f1,2,3
仅选择指定的一组字段(它也可以接受Kent's solution中的一系列字段)。答案 1 :(得分:1)
您可以简单地使用cut
来解决此问题:
cut -d'_' -f1-3 <<<STRING
以您的示例为例:
kent$ cut -d'_' -f1-3 <<<"UA399_GTTTCG_L002_R1_001.file.gz"
UA399_GTTTCG_L002
答案 2 :(得分:0)
使用GNU sed:
sed -E 's/((_*[^_]*){3}).*/\1/' file
答案 3 :(得分:0)
这可能对您有用(GNU sed):
sed 's/_[^_]*//3g' file
删除第三个(或更多)字符集,以下划线开头,然后是零个或多个非下划线。