1

我正在寻找一种使用通配符搜索和替换的班轮解决方案。

输入:

>sequence1
ATGCCAAACTGGAACT[A/T]ATTCAATGGCATGGACATAAATTC[A/C]ATACAATTACAAA
>sequnce2
ATCAAACCGGTATGTACATT[A,T/G]ATTCATTACTA

输出:

>sequence1
ATGCCAAACTGGAACTNATTCAATGGCATGGACATAAATTCNATACAATTACAAA
>sequnce2
ATCAAACCGGTATGTACATTNATTCATTACTA

我需要用 "N" 替换 "[" 和 "]" 之间的所有内容。数据长度可能会有所不同。我能够使用 awk 脚本找到该模式,但不知道如何替换它。请帮忙..

awk -F'[][]' '{for(i=2;i<=NF;i=i+2) print $i}' 1.fasta

我尝试的另一件事是 vi 编辑器

:%s/[.*\]/N/g

使用以上一个,它将所有“[A/T]ATTCAATGGCATGGACATAAATTC[A/C]”替换为 N

4

4 回答 4

4

尝试这样做:

perl -pe 's/\[.*?\]/N/g' file.txt

解释(关于正则表达式)

  • s///是基本的替换骨架(对于perlor sed):s/before/after/
  • s///g:最后的g修饰符,表示所有出现
  • \[: 表示 : 文字[(或其他任何反斜杠
  • .: 意思是:任何字符
  • *表示:0 或 N 个字符
  • ?告诉最后一个正则表达式处于非贪婪模式

也就是说,我有另一个有趣的解决方案:

perl -ne 'print join "N", split /\[.*?\]/;' file.txt

也许像这样更清楚?!(但还是一样)

perl -ne '
    print join(
        "N",
        split(/\[.*?\]/)
    );
' file.txt
于 2012-11-30T19:30:25.080 回答
0

只需添加另一个 awk 单行。您的目标是替换,无需使用 $x

awk '{gsub(/\[[^\]]*\]/,"N")}1' file
于 2012-11-30T22:33:28.220 回答
0
sed 's/\[[^]]*\]/N/g' file

编辑:按要求解释:

查找文字“[”([),然后是零个或多个非“]”字符([^]]*)的任何序列,然后是文字“]”(]),并将整个字符串替换为字母 N。在每条线上“全局”地进行。

于 2012-11-30T19:25:33.653 回答
0

这适用于 vi 编辑器:

%s/\[[^\]]*\]/N/g
于 2012-12-04T12:44:26.113 回答