我用正则表达式解析XML。众所周知,因此无需担心转义等问题以及正确的XML解析。
grep正在返回多行,我想将每个匹配存储到一个文件中。
但是,我要么在我的数组array=( $list )
中的每个代码之间获取每一行,要么得到整个输出array=( "$list" )
。
如何从grep中循环每个匹配?
我的脚本目前看起来像这样:
#!/bin/bash
list=$(cat result.xml|grep -ozP '(?s)<tagname.*?tagname>')
array=( "$list" )
arraySize=${#array[@]}
for ((i = 0; i <= $arraySize; i += 1)); do
match="${array[$i]}"
echo "$match" > "$i".xml
done
答案 0 :(得分:1)
根据this answer,即将推出的grep
版本将更改-z
标志的含义,以便输入和输出都以NUL终止。因此,它会自动执行您想要的操作,但它只能通过从git存储库下载和构建grep来实现今天。
与此同时,一个相当骇人的替代方案是使用-Z
标志来终止带有NUL字符的文件名。这意味着您需要打印“文件名”,您可以使用-H --label=
来执行此操作。那将在每次匹配之前打印一个空文件名后跟一个NUL ,这不是很理想,因为你真的希望每次匹配后之后的NUL 。但是,以下内容应该有效:
grep -ozZPH --label= '(?s)<tagname.*?tagname>' < result.xml | {
i=0
while IFS= read -rd '' chunk || [[ $chunk ]]; do
if ((i)); then
echo "$chunk" > $i.xml
fi
((++i))
done
}
答案 1 :(得分:0)
直接将你排成一条线圈
my_spliting_command | grep something | while read line
do
echo $line >myoutputfile.txt
done
答案 2 :(得分:0)
您可以先使用INSERT INTO table1 (col1, col2, col3, col4, col5)
SELECT "Value", col2, col3, "1900-01-01","9999-12-31"
FROM table2 t2
WHERE t2.val2 IN (MULTIPLE VALUES)
AND (Another Conditional);
获取所有匹配项,然后使用grep
将每个匹配的模式保存到单独的文件中(例如file1.xml,file2.xml等):
awk