我有一个 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,xmlstarlet或者撒克逊林特我自己的项目
例子 :
xmllint --xpath '//Currentnumber/text()' file.html
xmlstarlet sel -t -v '//Currentnumber/text()' file.html
saxon-lint --xpath --html '//Currentnumber/text()' file.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”的答案将是完全不可能的)