在sed中捕获组

时间:2010-07-21 18:17:46

标签: command-line sed

我有很多行

ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
ko04080 ko:GZMA

并且非常愿意摆脱右栏的ko:位。我正在尝试使用sed,如下所示:

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

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

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

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:21)

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

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

答案 1 :(得分:10)

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

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

当然你可以使用

sed --posix 's/ko://'

答案 2 :(得分:6)

这个

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

var="ko05414 ko:ITGA4"
echo ${var//"ko:"}

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

有关详细信息,请参阅Manipulating Strings

答案 3 :(得分:0)

@OP,如果你只是想摆脱“ko:”,那么

$ cat file
ko04062 ko:CXCR3
ko04062 ko:CX3CR1
ko04062 ko:CCL3
ko04062 ko:CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 ko:GZMA

$ awk '{sub("ko:","",$2)}1' file
ko04062 CXCR3
ko04062 CX3CR1
ko04062 CCL3
ko04062 CCL5
some text with a legit ko: this ko: will be deleted if you use gsub.
ko04080 GZMA

Jsut一张纸条。虽然您可以使用纯粹的bash字符串替换,但在更改单个字符串时它更有效。如果你有一个文件,特别是一个大文件,使用bash,而read循环仍然比使用sed或awk慢。