【问题标题】:Replacing words after specific tags into brackets using sed使用 sed 将特定标签后的单词替换为括号
【发布时间】:2018-10-19 07:54:30
【问题描述】:

我有一个从 BLAST 2.5.0+ 生成的 xml 文件。我想做一些改变。具体来说,我想把 OS= 之后的所有单词放在我的文件中,方法是把它放在 [] 中。我的原始文件格式如下:-

<Hit_num>1</Hit_num>
<Hit_id>TR:V4U0L5_9ROSI</Hit_id>
<Hit_def>gnl|V4U0L5| Uncharacterized protein OS=Homo sapien
OX=393305 GN=CICLE_v10008136mg PE=4 SV=1</Hit_def>
<Hit_accession>TR:V4U0L5_9ROSI</Hit_accession>
<Hit_len>388</Hit_len>

使用以下 CMD:-sed -E 's/&lt;Hit_def&gt;(.*)OS=([A-Za-z\.\-\,\_ ]+)(( [A-Z]+=.*))&lt;\/Hit_def&gt;/&lt;Hit_def&gt;\1[\2]\3&lt;\/Hit_def&gt;/g' input.xml &gt; output.xml,我设法得到以下信息:-

<Hit_num>1</Hit_num>
<Hit_id>TR:V4U0L5_9ROSI</Hit_id>
<Hit_def>gnl|V4U0L5| Uncharacterized protein [Homo sapien]
OX=393305 GN=CICLE_v10008136mg PE=4 SV=1</Hit_def>
<Hit_accession>TR:V4U0L5_9ROSI</Hit_accession>
<Hit_len>388</Hit_len>

但是,OS= 之后的一些词有不同的特点。例如:-

<Hit_num>1</Hit_num>
<Hit_id>TR:V4U0L5_9ROSI</Hit_id>
<Hit_def>gnl|V4U0L5| Uncharacterized protein OS=Yersinia enterocolitica serotype O:8 / biotype 1B (strain NCTC 13174 / 8081)
OX=393305 GN=CICLE_v10008136mg PE=4 SV=1</Hit_def>
<Hit_accession>TR:V4U0L5_9ROSI</Hit_accession>
<Hit_len>388</Hit_len>

使用与上面相同的 CMD,这些词根本不会放在 [] 内。如何使用 Mac OS X 将 OS= 之后的所有内容包含到 [] 中?

【问题讨论】:

  • OS=之后识别字符串结尾的标准是什么,会一直跟在GN=后面吗?
  • OS=之后字符串的结尾是OX=

标签: xml macos sed


【解决方案1】:

使用xslt,您可以以比sed 更健壮和强大的方式轻松操作 XML 文件:

输入:

<?xml version="1.0"?>
<Hit>
        <Hit_num>1</Hit_num>
        <Hit_id>TR:V4U0L5_9ROSI</Hit_id>
        <Hit_def>gnl|V4U0L5| Uncharacterized protein OS=Homo sapien OX=393305 GN=CICLE_v10008136mg PE=4 SV=1</Hit_def>
        <Hit_accession>TR:V4U0L5_9ROSI</Hit_accession>
        <Hit_len>388</Hit_len>
</Hit>

样式表:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect" xmlns:xalan="http://xml.apache.org/xslt" exclude-result-prefixes="xalan">
<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>
<xsl:strip-space elements="*" />

<xsl:template match="node() | @*">
        <xsl:copy>
                <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
</xsl:template>

    <xsl:template match="//Hit_def">
        <xsl:variable name="stringToReplace" select="."/>
        <Hit_def><xsl:value-of select="replace($stringToReplace,'OS=([^=]*)\s+OX=','[$1] OX=')"/></Hit_def>
    </xsl:template>
</xsl:stylesheet>

输出:

$ java -jar saxon9he.jar -s:hit.xml -xsl:hit.xsl
<?xml version="1.0" encoding="UTF-8"?>
<Hit>
   <Hit_num>1</Hit_num>
   <Hit_id>TR:V4U0L5_9ROSI</Hit_id>
   <Hit_def>gnl|V4U0L5| Uncharacterized protein [Homo sapien] OX=393305 GN=CICLE_v10008136mg PE=4 SV=1</Hit_def>
   <Hit_accession>TR:V4U0L5_9ROSI</Hit_accession>
   <Hit_len>388</Hit_len>
</Hit>

如果您需要saxon9he.jar,请从http://saxon.sourceforge.net/ 获取 您还可以使用xsltproc 或您系统上可用的其他命令。

最后但并非最不重要的一点是,您可能需要修剪反向引用以避免像[Home Sapien ] 这样的结果。如有需要可以使用以下stylesheet

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:redirect="http://xml.apache.org/xalan/redirect" extension-element-prefixes="redirect" xmlns:xalan="http://xml.apache.org/xslt" exclude-result-prefixes="xalan">
<xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>
<xsl:strip-space elements="*" />

<xsl:template match="node() | @*">
        <xsl:copy>
                <xsl:apply-templates select="node() | @*"/>
        </xsl:copy>
</xsl:template>

    <xsl:template match="//Hit_def">
        <xsl:variable name="stringToReplace" select="."/>
        <xsl:variable name="stringTmp" select="replace($stringToReplace,'OS=([^=]*)\s+OX=','[$1] OX=')"/>
        <Hit_def><xsl:value-of select="replace($stringTmp,'\s+\]\s+OX=','] OX=')"/></Hit_def>
    </xsl:template>
</xsl:stylesheet>

【讨论】:

  • 这行得通。非常感谢!像我这样的初学者需要一段时间才能真正理解并使其发挥作用。附带说明一下,对于那些初学者,要在 Mac 上使用它,请下载 saxon9he.jar 并按照标题为“从命令行运行 XSLT”下的文档中的说明进行操作。使用命令 java -jar dir/saxon9he.jar -s:file.xml -xsl:stylesheet1.xsl -o:output.xml 一切都会很好。
猜你喜欢
  • 2020-10-24
  • 1970-01-01
  • 2021-04-26
  • 2023-03-12
  • 2019-07-26
  • 2016-11-25
  • 2017-09-03
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多