我有很多行
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没有打印替换的结果
非常感谢任何帮助!
答案 0 :(得分:21)
sed正在输出其输入,因为替换不匹配。由于你可能正在使用GNU sed,试试这个:
echo "ko05414 ko:ITGA4" | sed 's/\(^ko[0-9]\{5\}\)\tko:\(.*$\)/\1\2/'
答案 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慢。