Замена слов после определенных тегов в скобках с помощью sed - PullRequest
0 голосов
/ 09 мая 2018

У меня есть XML-файл, созданный из BLAST 2.5.0+. Я хочу сделать некоторые изменения. В частности, я хочу поместить все слова после 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/<Hit_def>(.*)OS=([A-Za-z\.\-\,\_ ]+)(( [A-Z]+=.*))<\/Hit_def>/<Hit_def>\1[\2]\3<\/Hit_def>/g' input.xml > 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 сверху эти слова вообще не будут помещаться в []. Что я могу сделать, чтобы включить все после OS = в [] с помощью Mac OS X?

1 Ответ

0 голосов
/ 09 мая 2018

Используя xslt, вы можете легко управлять XML-файлами более надежным и мощным способом, чем sed:

ВХОД:

<?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>

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="."/>
        <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...