Regexp在unix

时间:2016-07-08 10:50:29

标签: 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>
    </interfaces>
</audit>

尝试使用以下unix命令

#!/bin/bash
for line in `cat  test.xml | grep -oP "(?<=interface_dtls>)[^<]+"`; 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

实际“ECHO”输出:

ABCD,ABCD
TESTING,123

预期的“ECHO”输出:

ABCD,ABCD 123
TESTING,123 TEST

缺少信息(空格后信息),我的查询无法正常工作。

3 个答案:

答案 0 :(得分:2)

使用xml_grep,建议的解析选项越多,因为grep不是XML感知工具。

$ xml_grep 'interface_dtls' file --text_only
ABCD,ABCD 123
TESTING,123 TEST

还可以在评论中使用anubhava指向的grep。可能不是最好的方法,但可以做一次性调试。要获得正确的功能,请使用任何XML可读命令(例如xmllintxml_grep)。

$ grep -oP "(?<=<interface_dtls>)[^<]+" xml_file
ABCD,ABCD 123
TESTING,123 TEST

用于从命令中提取单个单词的骨架代码可以如下完成。我会根据你的需要调整它,不要使用过时的``style命令扩展,而是在适用的地方使用$

#!/bin/bash

while read -r paramA paramB;
do
    interface_code=$(echo $paramA | awk -F ',' '{print $1}')
    prcdr_cd=$(echo $paramA | awk -F ',' '{print $2}')

    echo $interface_code $prcdr_cd

done < <(xml_grep 'interface_dtls' file --text_only)

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

经过一些研究后,我能够解决这个问题。但感谢https://stackoverflow.com/users/5291015/inianhttps://stackoverflow.com/users/4941495/kusalanandahttps://stackoverflow.com/users/548225/anubhava提供了有用的见解。

的test.xml

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

在:

#!/bin/bash
for line in `cat  test.xml | grep -oP "(?<=interface_dtls>)[^<]+"`; 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

后:

#!/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

“ECHO”输出:

ABCD,ABCD 123
TESTING,123 TEST