sed删除第三个下划线之后的所有文本

时间:2018-09-19 13:07:22

标签: regex sed

我需要编辑以下字符串

  

UA399_GTTTCG_L002_R1_001.file.gz

  

UA399_GTTTCG_L002

我尝试了sed 's/^\(.*\)_.*/\1/',但产生了

  

UA399_GTTTCG_L002_R1

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

您可以像这样使用sedawkcut

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

删除第三个(或更多)字符集,以下划线开头,然后是零个或多个非下划线。