我正在尝试使用 grep 从大量 XML 文件中提取属性。我尝试过使用,grep -E -m 1 -o -Z "<tag>(.*)</tag>" /home/somepath/*.xml || printf "NULL"
但出于某种原因,如果正则表达式不匹配,它不会为文件返回 NULL。这里的最终目的是构建这些文件的基本 SQL 数据库,使用标签中的信息来填充列。这是我第一次涉足数据库,所以也许我做错了?
答案1
因为你想要每个文件都有一些东西,所以你必须使用grep
每个文件,例如:
$ find /home/somepath -type f -name '*.xml' | \
> while read path; do \
> grep -E -H -m 1 -o -Z "<tag>(.*)</tag>" "$path" || echo -e "$path\x00NULL"; \
> done
具体来说:
$ find /home/somepath -type f -name '*.xml' -print | \
这将生成要搜索的文件列表并将其导入到while
。 它唯一需要做的就是每行打印一个路径,因此有很多方法可以做到这一点。
> while read path;do \
这会将每一行读入path
shell 变量并循环直到read
返回false
,当它到达文件末尾时就会返回,当它find
生成了所有要去的路径时就会返回。
> grep -E -H -m 1 -o -Z "<tag>(.*)</tag>" "$path" || echo -e "$path\x00NULL"; \
这将搜索当前文件(在 中$path
)。如果在文件中未找到模式,grep
则返回false
(即以非零退出代码退出),因此echo
将执行 。-e
表示解释转义,因此echo
将打印当前路径、ASCIInul
和文字NULL
。这是模拟 的grep
输出,它将是当前路径(由 强制-H
,grep
在搜索单个文件时通常不会输出路径)、ASCII nul
(因为-Z
)和匹配的文本。
> done
关闭while
循环。
答案2
尝试一下这个方法:
grep -E -m 1 -o -Z "<tag>(.*)</tag>" /home/somepath/*.xml 2>&- || echo "NULL"