Grep 仅针对标签之间的内容

Grep 仅针对标签之间的内容

我有一个 html 类型的文件,其中包含一个标签,如下所示:

<Currentnumber>0.3.5</Currentnumber>

如何捕获变量的值0.3.5仅有的这?

我已经按照如下方式 grep 了这条线:

grep -E "<Currentnumber>.*</Currentnumber>$" myfile

grep如果出于教育目的,任何答案也提供所使用参数的解释,我将不胜感激。

请注意,该行以一些空格(或制表符)开头,这就是为什么以下内容不起作用

grep -E "^<Currentnumber>.*</Currentnumber>$" myfile

答案1

永远不要用正则表达式解析 html!这是 stackexchange 网站上最常见的错误。

最好使用 XML/HTML 解析器,例如,或者撒克逊林特我自己的项目

例子 :

xmllint --xpath '//Currentnumber/text()' file.html
xmlstarlet sel -t -v '//Currentnumber/text()' file.html
saxon-lint --xpath --html '//Currentnumber/text()' file.html

查看:将正则表达式与 HTML 标签一起使用

答案2

使用 sed 和正则表达式

sed -e 's/<Currentnumber>\(.*\)<\/Currentnumber>/\1/' file.html

答案3

希望这对下一个人有帮助:

$ echo '<Currentnumber>0.3.5</Currentnumber>' | cut -d '>' -f 2 | cut -d '<' -f1
0.3.5

关于这个答案:

  • 你的字符串/干草堆是“已知的”,是吗?所以像这样的技巧是公平的。
  • 我将指出该缺陷:如果有人更改了标记,则该解决方案可能需要更新。美好的。 (这仍然没有理由诉诸于性能不佳且难以维护的正则表达式..不是为了“这个”)
  • (也许进行测试或健全性检查,确保您总是能得到一个内部版本号,因此这样的更改很快就会被注意到)
  • 不需要特殊的工具......即使你有一个最小的外壳,cut也会在那里。 (“要求 devops 在容器内安装 linter”的答案将是完全不可能的)

相关内容