我在这里使用这个答案:https://stackoverflow.com/a/18622953/1797263替换 pom.xml 文件中的版本。我遇到的问题是它正在删除前面的空格,而我想保留前面的空格。空白可以是 2 或 3 个制表符或空格,具体取决于开发人员如何格式化文件。
这是一个例子:
<dependency>
<groupId>GROUP</groupId>
<artifactId>ARTIFACT</artifactId>
<version>OLD_VERSION</version>
</dependency>
我的命令:sed -i '/<artifactId>ARTIFACT<\/artifactId>/!b;n;c<version>NEW_VERSION</version>' pom.xml
我的输出:
<dependency>
<groupId>GROUP</groupId>
<artifactId>ARTIFACT</artifactId>
<version>NEW_VERSION</version>
</dependency>
这是我希望的替代品:
<dependency>
<groupId>GROUP</groupId>
<artifactId>ARTIFACT</artifactId>
<version>NEW_VERSION</version>
</dependency>
我通读了 GNU Sed 手册,但找不到任何有帮助的内容。
请您参考如下方法:
使用正确的xml解析器:
xmlstarlet edit -L -u '/dependency/version' -v NEW_VERSION file.xml
输出
<?xml version="1.0"?>
<dependency>
<groupId>GROUP</groupId>
<artifactId>ARTIFACT</artifactId>
<version>NEW_VERSION</version>
</dependency>
不要使用正则表达式解析 XML/HTML,使用适当的 XML/HTML 解析器和强大的 xpath查询。
理论:
According to the compiling theory, XML/HTML can't be parsed using regex based on finite state machine. Due to hierarchical construction of XML/HTML you need to use a pushdown automaton and manipulate LALR grammar using tool like YACC.
realLife©®™ 日常工具 shell :
您可以使用以下其中一项:
xmllint通常默认与 libxml2
、xpath1 一起安装(检查 my wrapper 以换行符分隔输出
xmlstarlet可以编辑、选择、转换...默认不安装,xpath1
xpath通过 perl 的模块 XML::XPath, xpath1 安装
xidel xpath3
saxon-lint我自己的项目,@Michael Kay 的 Saxon-HE Java 库 xpath3 的包装器
或者你可以使用高级语言和适当的库,我认为:
perl的XML::LibXML
, XML::XPath
, XML::Twig::XPath
, HTML::TreeBuilder::XPath
ruby nokogiri , check this example
php DOMXpath
,check this example