grep:如果为假则返回 NULL

grep:如果为假则返回 NULL

我正在尝试使用 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 \

这会将每一行读入pathshell 变量并循环直到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输出,它将是当前路径(由 强制-Hgrep在搜索单个文件时通常不会输出路径)、ASCII nul(因为-Z)和匹配的文本。

> done

关闭while循环。

答案2

尝试一下这个方法:

grep -E -m 1 -o -Z "<tag>(.*)</tag>" /home/somepath/*.xml 2>&- || echo "NULL"

相关内容