[英]Use Sed to replace next line but keep the white space
我在这里使用这个答案: 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查询。
根据编译理论,不能使用基于有限状态机的正则表达式来解析 XML/HTML。 由于 XML/HTML 的层次结构,您需要使用下推自动机并使用YACC 等工具操作LALR语法。
您可以使用以下方法之一:
xmllint通常默认与libxml2
、 xpath1 一起安装(检查我的包装器以换行分隔输出
xmlstarlet可以编辑、选择、转换...默认没有安装,xpath1
xpath通过 perl 的模块 XML::XPath, xpath1 安装
xidel xpath3
saxon-lint我自己的项目,包装@Michael Kay 的 Saxon-HE Java 库 xpath3
python的lxml
( from lxml import etree
)
perl的XML::LibXML
、 XML::XPath
、 XML::Twig::XPath
、 HTML::TreeBuilder::XPath
这可能对你有用(GNU sed):
sed -i '/<artifactId>ARTIFACT<\/artifactId>/{n;s/\S.*/<version>NEW_VERSION<\/version>/}' file
使用第一个非空白字符作为替换字符串的起始位置,用新版本覆盖旧版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.