删除列之间的字符串

时间:2015-05-22 19:26:49

标签: regex string awk sed

我正在尝试删除两个字符串之间的文本,但保留模式之前和之后的所有数据。我正在使用的示例文本:

comp117_c0_seq1 len=214 path=[173:0-52 372:53-71 226:72-213]
comp143_c0_seq1 len=285 path=[263:0-226 490:227-284]
comp541_c0_seq1 len=230 path=[1:0-132 134:133-229]  gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76

所以目标是删除以“len”开头并以“path = [...]”结尾的文本。并保留所有文本区域之前和之后的所有内容。 有人会有任何建议。我希望输出看起来像:

comp117_c0_seq1 
comp117_c0_seq1
comp541_c0_seq1 gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76

提前致谢。

4 个答案:

答案 0 :(得分:2)

使用sed

$ sed -r 's/len[^]]*]//' input_file
comp117_c0_seq1 
comp143_c0_seq1 
comp541_c0_seq1   gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76
  • len匹配len

  • [^]]*否定字符类,匹配]以外的任何内容。

    *量词,确保] 以外的任何内容匹配零或多个tiems

  • ]匹配]

  • 末尾的结尾path

使用awk

$ awk '{sub("len[^]]*]", "")}1' input
comp117_c0_seq1 
comp143_c0_seq1 
comp541_c0_seq1   gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76
  • sub(ere, repl[, in ])替换字符串repl代替第一个实例              字符串in和return中的扩展正则表达式ERE              替换次数。

  • 1总是如此。 awk采用默认操作来打印整个记录。

答案 1 :(得分:1)

从您的示例输入和输出中,您似乎要删除从len到下一个]的所有内容。这是(那个BSD / Mac sed):

sed -E 's/len[^]]*\]//'

含义:替换len和每个不是]的字符,然后是]。这会在遇到的第一个]处停止。这是因为sed很贪心。 perl知道的更好:

perl -pe 's/len.*?\]//'

*?是非贪婪的运算符,所以它只会吃掉下一个不需要的令牌。

答案 2 :(得分:0)

我会用sed:

来解决这个问题
cat file | sed -e 's/(^.*)len=.*path=\[[^\]*\](.*)$/\1\2/'

我可能需要在发布您的预期输出时对其进行修改。

答案 3 :(得分:0)

假设:

$ echo "$tgt"
comp117_c0_seq1 len=214 path=[173:0-52 372:53-71 226:72-213]
comp143_c0_seq1 len=285 path=[263:0-226 490:227-284]
comp541_c0_seq1 len=230 path=[1:0-132 134:133-229]  gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76

的Perl:

$ echo "$tgt" | perl -lne 'print "$1$2" if /^(\w+)\slen=\d+\sp
ath=\[[^\]]+?\](.*)$/'
comp117_c0_seq1
comp143_c0_seq1
comp541_c0_seq1  gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76

或者,

$ echo "$tgt" | perl -lne 'print if s/len[^]]+\] *//'
comp117_c0_seq1 
comp143_c0_seq1 
comp541_c0_seq1 gi|356502740|ref|XP_003520174.1| PREDICTED: uncharacterized protein LOC100809655 [Glycine max]  1.30898e-39 68  76