在sed中捕获组

Mik*_*war 23 command-line sed

我有很多行的形式

ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
ko04080 ko:GZMA
Run Code Online (Sandbox Code Playgroud)

并且非常希望摆脱右侧列的ko:位.我正在尝试使用sed,如下所示:

echo "ko05414 ko:ITGA4" | sed 's/\(^ko\d{5}\)\tko:\(.*$\)/\1\2/'
Run Code Online (Sandbox Code Playgroud)

它只是输出我回声的原始字符串.我是命令行脚本,sed,管道等新手,所以如果/当我做一些非常愚蠢的事情时,请不要太生气.

令我困惑的主要事情是,如果我将该\1\2位反转\2\1或仅使用一个组,则会发生同样的事情.我想,这意味着我遗漏了一些关于将echo输出管道输入到sed的机制,或者我的正则表达式错误或者我使用的是sed错误或者sed没有打印替换的结果.

任何帮助将不胜感激!

nin*_*alj 21

sed正在输出其输入,因为替换不匹配.由于你可能正在使用GNU sed,试试这个:

echo "ko05414     ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/'
Run Code Online (Sandbox Code Playgroud)
  • \ d - > [0-9]因为GNU sed无法识别\ d
  • {} - >\{\}因为GNU sed默认使用基本的正则表达式.

  • @Mike Dewar - 噢,这是重要的信息...我认为OS X使用类似BSD的sed,而人们常常假设人们使用GNU sed (7认同)
  • 这仍然给我同样的错误.我在OSX - 不知道如何找出我是否使用GNU sed ... (2认同)
  • 在OSX上,GNU sed被称为`gsed` (2认同)

And*_*ers 10

这应该做到这一点.您也可以跳过最后一组,而只是使用,\1但是因为您正在学习sed和正则表达式这是好事.我想在中间使用一个非捕获组,(:? )但由于某种原因我无法使用sed,也许它不受支持.

sed --posix 's/\(^ko[0-9]\{5\}\)\( ko:\)\(.*$\)/\1 \3/g' file > result
Run Code Online (Sandbox Code Playgroud)

当然你可以使用

sed --posix 's/ko://'
Run Code Online (Sandbox Code Playgroud)


get*_*kha 6

不需要 sed

以下是使用bash执行此操作的方法:

var="ko05414 ko:ITGA4"
echo ${var//"ko:"}
Run Code Online (Sandbox Code Playgroud)

$ {var //"ko:"}将所有"ko:"替换为""

有关详细信息,请参阅操作字符串

  • 在我/我/学习sed时,这种方法让我感到非常精彩和简单.我不知道这种语法.所有这一命令行都很棒. (3认同)