Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 使用sed将特定标记后的单词替换为括号_Xml_Macos_Sed - Fatal编程技术网

Xml 使用sed将特定标记后的单词替换为括号

Xml 使用sed将特定标记后的单词替换为括号,xml,macos,sed,Xml,Macos,Sed,我有一个由blast2.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_v10

我有一个由blast2.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>
1
TR:V4U0L5\u 9ROSI
gnl | V4U0L5 |非特征蛋白OS=智人
OX=393305 GN=CICLE_v10008136mg PE=4 SV=1
TR:V4U0L5\u 9ROSI
388
使用以下命令:-
sed-E的/(*)OS=([A-Za-z\.-\,\\\+)(([A-z]+=.*))/\1[\2]\3/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>
1
TR:V4U0L5\u 9ROSI
gnl | V4U0L5 |非特征蛋白质[智人]
OX=393305 GN=CICLE_v10008136mg PE=4 SV=1
TR:V4U0L5\u 9ROSI
388
但是,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>
1
TR:V4U0L5\u 9ROSI
gnl | V4U0L5 |非特征蛋白OS=小肠结肠炎耶尔森菌血清型O:8/生物型1B(菌株NCTC 13174/8081)
OX=393305 GN=CICLE_v10008136mg PE=4 SV=1
TR:V4U0L5\u 9ROSI
388

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

使用
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>

OS=
之后标识字符串结尾的标准是什么?它后面总是跟着
GN=
?在OS=之后的字符串结尾是OX=这是有效的。非常感谢你!像我这样的初学者花了一段时间才真正理解并使它起作用。作为补充说明,对于那些初学者来说,要在Mac上使用它,请下载saxon9he.jar并按照标题为“从命令行运行XSLT”的文档中的说明进行操作。使用命令java-jardir/saxon9he.jar-s:file.xml-xsl:stylesheet1.xsl-o:output.xml,一切都会很好地工作。
<?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>