我正在尝试使用以下代码,但它不能正常工作。我是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
缺少信息(空格后信息),我的查询无法正常工作。
答案 0 :(得分:2)
使用xml_grep
,建议的解析选项越多,因为grep
不是XML
感知工具。
$ xml_grep 'interface_dtls' file --text_only
ABCD,ABCD 123
TESTING,123 TEST
还可以在评论中使用anubhava
指向的grep
。可能不是最好的方法,但可以做一次性调试。要获得正确的功能,请使用任何XML可读命令(例如xmllint
或xml_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/inian,https://stackoverflow.com/users/4941495/kusalananda和https://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