在unix中,Regexp未按预期工作

在unix中,Regexp未按预期工作,regex,xml,pcre,Regex,Xml,Pcre,我正在尝试下面的代码,但它不能正常工作。我对REGEX不熟悉。请分享你的想法。提前谢谢 test.xml <?xml version="1.0"?> <audit> <interfaces> <interface_dtls>ABCD,ABCD 123</interface_dtls> <interface_dtls>TESTING,123 TEST</interface_dtls

我正在尝试下面的代码,但它不能正常工作。我对REGEX不熟悉。请分享你的想法。提前谢谢

test.xml

<?xml version="1.0"?>
<audit>
    <interfaces>
        <interface_dtls>ABCD,ABCD 123</interface_dtls>
        <interface_dtls>TESTING,123 TEST</interface_dtls>
    </interfaces>
</audit>
<?xml version="1.0"?>
<audit>
    <interfaces>
        <interface_dtls>ABCD,ABCD 123</interface_dtls>
        <interface_dtls>TESTING,123 TEST</interface_dtls>
    </interfaces>
</audit>
预期的“回声”输出:

由于缺少信息(空格后的信息),我的查询无法按预期工作。

使用更推荐的解析选项,因为
grep
不是一个
XML
感知工具

$ xml_grep 'interface_dtls' file --text_only
ABCD,ABCD 123
TESTING,123 TEST
你也可以使用over在评论中指出的
grep
。可能不是最好的方法,但可以一次性调试。要获得正确的功能,请使用任何XML可读命令(例如
xmllint
XML\u grep

使用,更推荐的解析选项,因为
grep
不是
XML
感知工具

$ xml_grep 'interface_dtls' file --text_only
ABCD,ABCD 123
TESTING,123 TEST
你也可以使用over在评论中指出的
grep
。可能不是最好的方法,但可以一次性调试。要获得正确的功能,请使用任何XML可读命令(例如
xmllint
XML\u grep


另一个答案中提到了
xml\u grep
实用程序。这将使用,它还能够在命令行上验证和修改XML文件:

$ xml sel -t -v '//interface_dtls' -nl data.xml
ABCD,ABCD 123
TESTING,123 TEST

另一个答案中提到了
xml\u grep
实用程序。这将使用,它还能够在命令行上验证和修改XML文件:

$ xml sel -t -v '//interface_dtls' -nl data.xml
ABCD,ABCD 123
TESTING,123 TEST

经过一点研究,我终于解决了这个问题。但这要感谢,也要感谢有帮助的见解

test.xml

<?xml version="1.0"?>
<audit>
    <interfaces>
        <interface_dtls>ABCD,ABCD 123</interface_dtls>
        <interface_dtls>TESTING,123 TEST</interface_dtls>
    </interfaces>
</audit>
<?xml version="1.0"?>
<audit>
    <interfaces>
        <interface_dtls>ABCD,ABCD 123</interface_dtls>
        <interface_dtls>TESTING,123 TEST</interface_dtls>
    </interfaces>
</audit>

经过一点研究,我终于解决了这个问题。但这要感谢,也要感谢有帮助的见解

test.xml

<?xml version="1.0"?>
<audit>
    <interfaces>
        <interface_dtls>ABCD,ABCD 123</interface_dtls>
        <interface_dtls>TESTING,123 TEST</interface_dtls>
    </interfaces>
</audit>
<?xml version="1.0"?>
<audit>
    <interfaces>
        <interface_dtls>ABCD,ABCD 123</interface_dtls>
        <interface_dtls>TESTING,123 TEST</interface_dtls>
    </interfaces>
</audit>


无需使用
cat
进行循环,只需
grep-oP'(?)[^@anubhava:晚了几秒钟,你就赢了我!无需使用
cat
进行循环,只需
grep-oP'(?)[^@anubhava:晚了几秒钟,你打败了我!谢谢Inian。我尝试了你提到的第一个选项,它在命令行中运行良好。但是我必须使用for循环来构建配置单元查询,并根据中的值从命令行提交…所以我用下面的代码再次尝试,但它不起作用。我是unix脚本新手h me.#!/bin/bash代表
grep-oP中的行(?@GokulkrishnaSurapureddy;感谢您的关注,您能用requirement@GokulkrishnaSurapureddy:我提供了一个框架代码供您进一步尝试,我无法按照社区道德规范提供完整的代码。请确保您在发现答案有用时接受答案。谢谢!我将根据我的要求进行修改irement。如果可能的话,你能告诉我当前代码哪里出了问题。提前感谢你的帮助。感谢Inian。我尝试了你提到的第一个选项,它在命令行中运行良好。但是我必须使用for循环来构建配置单元查询,并根据…中的值从命令行提交。因此,我再次尝试使用下面的代码,结果是不工作。我对unix脚本很新,请与我一起公开。“!/bin/bash for line in
grep-oP”(?@GokulkrishnaSurapureddy;感谢您的关注,您能用requirement@GokulkrishnaSurapureddy:我提供了一个框架代码供您进一步尝试,我无法按照社区道德规范提供完整的代码。请确保您在发现答案有用时接受答案。谢谢!我将根据我的要求进行修改irement.如果可能的话,你能告诉我当前代码哪里出了问题吗?提前感谢你的帮助。LPX-00202失败:无法打开“sel”(错误200)@GokulkrishnaSurapureddy在你的系统(Oracle Linux?)上很可能是
xml
是一个完全不同的实用程序。请确保您确实安装了XMLStarlet,并且您知道它的主要可执行文件名。如果它名为
xml
,则您可能必须提供该可执行文件的完整路径,以便其他
xml
实用程序不会运行。@GokulkrishnaSurapureddy,请稍候,您正在运行g这是在命令行上,而不是在数据库客户端或类似的愚蠢的东西中?@GokulkrishnaSurapureddy好,那么请参阅我之前的评论。LPX-00202失败:无法打开“sel”(错误200)@GokulkrishnaSurapureddy可能是系统(Oracle Linux?)上的
xml
是一个完全不同的实用程序。请确保您确实安装了XMLStarlet,并且您知道它的主要可执行文件名。如果它名为
xml
,则您可能必须提供该可执行文件的完整路径,以便其他
xml
实用程序不会运行。@GokulkrishnaSurapureddy,请稍候,您正在运行g这是在命令行上,而不是在数据库客户端或类似的愚蠢的东西上?@GokulkrishnaSurapureddy Good,那么请看我之前的评论。
#!/bin/bash
IFS='$\n'
for line in `cat  test.xml | grep -oP "(?<=interface_dtls>)[^<]+" | cut -d '>' -f 2 | cut -d '<' -f 1`; do
    echo $line  --Displaying line only for debugging purpose
    interface_code=$(echo $line | awk -F ',' '{print $1}')
    prcdr_cd=$(echo $line | awk -F ',' '{print $2}')
    hive -e "select * from table \
    where sub_sys_cd='$interface_code' and data_prcdr_desc='$prcdr_cd';"
done
ABCD,ABCD 123
TESTING,123 TEST