替换特定字符包围的文本

时间:2013-09-29 19:28:02

标签: regex perl replace sed awk

我有这种类型的数据(所有大字母都是字符串)

>A|B|C|D|E|F
test test test
test test
>A|B|C|D|E|F
test test test
test 

并想要删除C,D,E:

>A|B|F
test test test
test test
>A|B|F
test test test
test

在“测试”文本中,不会出现|。我已使用sed尝试了此操作,但我无法替换两个|之后的文本 先感谢您。

6 个答案:

答案 0 :(得分:3)

Perl oneliner,

perl -F'\|' -lane 'print /\|/ ? join "|", @F[0,1,5] : $_' file

它将每一行拆分|个字符,并将值存储在@F数组中。如果行包含|,则它从@F获取元素0,1和5,否则保持原样。

Oneliner沮丧,

perl -MO=Deparse -F'\|' -lane 'print /\|/ ? join "|", @F[0,1,5] : $_' file
BEGIN { $/ = "\n"; $\ = "\n"; }         # -l switch makes print to add newline
LINE: while (defined($_ = <ARGV>)) {    # -n switch
    chomp $_;                           # -l switch chomps newlines
    our(@F) = split(/\|/, $_, 0);       # -a switch splits on value of -F switch
    print /\|/ ? join('|', @F[0, 1, 5]) : $_;
}

答案 1 :(得分:3)

$ cat file
>A|B|C|D|E|F
test test test
test test
>A|B|C|D|E|F
test test test
test
>gene_8|GeneMark.hmm|322_aa|+|3803|4771TS28_contig03869
test test test
test test
$
$ sed -r 's/(([^|]+\|){2})(([^|]+\|){3})/\1/' file
>A|B|F
test test test
test test
>A|B|F
test test test
test
>gene_8|GeneMark.hmm|4771TS28_contig03869
test test test
test test

答案 2 :(得分:2)

sed效果很好:

$ cat 1
>A|B|C|D|E|F
test test test
test test
>A|B|C|D|E|F
test test test
test
$ sed 's/C|D|E|//' 1
>A|B|F
test test test
test test
>A|B|F
test test test
test

<强>更新

$ sed  's/\([^|]|[^|]|\).*|/\1/' 1
>A|B|F
test test test
test test
>A|B|F
test test test
test

答案 3 :(得分:2)

或许适合此

awk --re-interval -F'|'\
      'NF > 4{$0=gensub(/^(([^|]*\|){2})([^|]*\|){3}(.*)$/, "\\1\\4", -1)};
      {print}' file

答案 4 :(得分:1)

这应该这样做。 -i选项指定要就地编辑文件。

perl -i.bak -pe 's/\|[CDE]//g' file

或使用sed

sed -i.bak -re 's/\|[CDE]//g' file

答案 5 :(得分:0)

awk工作正常:

awk '{sub(/C\|D\|E\|/,"")}1' file
>A|B|F
test test test
test test
>A|B|F
test test test
test