我可以使用 grep 命令从文件中提取完整日期吗?

ari*_*ris 4 grep bash xml text-processing

我需要帮助使用 grep 从 Linux 系统上的文件中提取分区日期时间。

源文件是一个 XML,包含以下数据:

<item start="20231010073000 +0100" stop="20231010100000 +0100">...</item>
Run Code Online (Sandbox Code Playgroud)

我需要提取完整的开始日期,但使用 grep 我无法得到完整的结果。我的代码:

for startDate in $(grep -Eo 'start="[0-9]{14} [\+|\-][0-9]{4}"' "$filepath" ); do
  echo "$startDate"
done
Run Code Online (Sandbox Code Playgroud)

我得到了两个不同的结果:

start="20231010073000
+0100"
Run Code Online (Sandbox Code Playgroud)

我可以得到它如下:

start="20231010073000 +0100"
Run Code Online (Sandbox Code Playgroud)

我尝试过\s[[:space:]]和其他示例,但使用相同的解决方案。

我的代码似乎有错误,但我无法修复它!

我很感谢任何形式的帮助!

Gil*_*not 8

不要使用grepregex解析HTML/XML您不能、不得使用旨在处理原始文本行的工具解析任何结构化文本,例如 XML/HTML。如果需要处理 XML/HTML,请使用 XML/HTML 解析器。绝大多数语言都内置了对解析 XML 的支持,并且有专门的工具,例如xidelxmlstarlet或者xmllint如果您需要从命令行 shell 快速进行操作... 如果您无法访问适当的工具,切勿接受工作。


最先进的命令行工具是xidel. 语法比or更直观/现代(并且支持XPath3其他工具受限制的情况XPath1),请参阅:xmlstarletxmllint

xidel -e '//item/@start' -s file.xml
20231010073000 +0100
Run Code Online (Sandbox Code Playgroud)
  • -e用于XPath e表达
  • -s对于silent(无状态信息)

查询语言XPath在许多情况下对于解析 XML/HTML 非常有用。


XPath教程:

https://developer.mozilla.org/en-US/docs/Web/XPath
http://www.w3schools.com/xpath/xpath_functions.asp
http://stackoverflow.com/tags/xpath/info https://www.w3schools.com/xpath/xpath_functions.asp http://stackoverflow.com/tags/xpath/info
https:// /topswagcode.com/xpath/(互动XPath游戏,当您具备基础知识并想要互动练习时)