【问题标题】:multiple sed with -e and escape characters带有 -e 和转义字符的多个 sed
【发布时间】:2020-02-03 10:44:29
【问题描述】:

我正在尝试在 gzip 压缩文件中进行多次替换,但遇到了问题。

zcat PteBra.fa.align.gz | sed -e 's#Simple_repeat/Satellite/Y-chromosome#Simple_repeat/Satellite#g' -e sed 's#Unknown/Unknown/Y-chromosome#Unknown/Unknown#g' -e sed 's#DNA/DNA/TcMar#DNA/TcMar#g' -e sed 's#DNA/DNA/Crypton#DNA/Crypton#g' -e sed 's#DNA/DNA/PIF-Harbinger#DNA/PIF-Harbinger#g' -e sed 's#DNA/DNA/CMC-Chapaev-3#DNA/CMC-Chapaev-3#g' -e sed 's#SINE/SINE/RTE#SINE/RTE#g' > PteBra.fa.align.corrected

请注意,我使用 # 而不是标准 / 因为 / 在我要替换的文本中存在。每个单独的 sed 都可以正常工作,但是将它们串在一起会产生这种一致的错误:

sed: -e expression #2, char 3: unterminated `s' command

我已经到处寻找解决方案,但最后,为了完成工作,我只是单独完成了所有 sed。它需要永远,所以我想让这个选项起作用。

我已经在这里工作了几个小时,希望能得到一些帮助。

我做错了什么?

谢谢。

【问题讨论】:

  • sed 只能出现一次,无需在每个-e 之后重复。

标签: bash sed


【解决方案1】:

您不必每次都写-e sed-e 可以。

zcat PteBra.fa.align.gz | sed -e 's#Simple_repeat/Satellite/Y-chromosome#Simple_repeat/Satellite#g' -e 's#Unknown/Unknown/Y-chromosome#Unknown/Unknown#g' -e 's#DNA/DNA/TcMar#DNA/TcMar#g' -e 's#DNA/DNA/Crypton#DNA/Crypton#g' -e 's#DNA/DNA/PIF-Harbinger#DNA/PIF-Harbinger#g' -e 's#DNA/DNA/CMC-Chapaev-3#DNA/CMC-Chapaev-3#g' -e 's#SINE/SINE/RTE#SINE/RTE#g' > PteBra.fa.align.corrected

或者您可以在 sed 字符串表达式本身中使用分号

zcat PteBra.fa.align.gz | sed -e '
s#Simple_repeat/Satellite/Y-chromosome#Simple_repeat/Satellite#g;
s#Unknown/Unknown/Y-chromosome#Unknown/Unknown#g;
s#DNA/DNA/TcMar#DNA/TcMar#g;
s#DNA/DNA/Crypton#DNA/Crypton#g;
s#DNA/DNA/PIF-Harbinger#DNA/PIF-Harbinger#g; 
s#DNA/DNA/CMC-Chapaev-3#DNA/CMC-Chapaev-3#g;
s#SINE/SINE/RTE#SINE/RTE#g
' > PteBra.fa.align.corrected

【讨论】:

  • 或者简单地把它变成一个由';'分隔的表达式,例如sed 's#Simple_repeat/Satellite/Y-chromosome#Simple_repeat/Satellite#g;s#Unknown/Unknown/Y-chromosome#Unknown/Unknown#g; ...'
【解决方案2】:

由于您已经有了正确的答案,因此这不是另一个答案 但对实际操作的一个小建议。
我想在一行中编写sed 命令可能是一项混乱的工作。怎么样 准备一个描述replacee和replacer的查找表 以 csv 格式在一行中,例如:

table.txt

Simple_repeat/Satellite/Y-chromosome,Simple_repeat/Satellite
Unknown/Unknown/Y-chromosome,Unknown/Unknown
DNA/DNA/TcMar,DNA/TcMar
DNA/DNA/Crypton,DNA/Crypton
DNA/DNA/PIF-Harbinger,DNA/PIF-Harbinger
DNA/DNA/CMC-Chapaev-3,DNA/CMC-Chapaev-3
SINE/SINE/RTE,SINE/RTE

然后你可以执行下面的awk脚本来替换字符串:

zcat PteBra.fa.align.gz | awk -F, '
    NR==FNR {repl[$1] = $2; next}
    {
        for (r in repl) gsub(r, repl[r])
        print
    }
' table.txt - > PteBra.fa.align.corrected

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2014-06-14
    • 2013-02-21
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多