将每条多线Grep输出保存到阵列记录

时间:2016-04-06 19:11:06

标签: regex bash

我用正则表达式解析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

3 个答案:

答案 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