繁体   English   中英

使用 Sed 替换下一行但保留空白

[英]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 手册,但找不到任何有用的东西。

使用适当的解析器:

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 解析器和强大的查询。

理论 :

根据编译理论,不能使用基于有限状态机的正则表达式来解析 XML/HTML。 由于 XML/HTML 的层次结构,您需要使用下推自动机并使用YACC 等工具操作LALR语法。

realLife©®™ 日常工具:

您可以使用以下方法之一:

xmllint通常默认与libxml2 、 xpath1 一起安装(检查我的包装器以换行分隔输出

xmlstarlet可以编辑、选择、转换...默认没有安装,xpath1

xpath通过 perl 的模块 XML::XPath, xpath1 安装

xidel xpath3

saxon-lint我自己的项目,包装@Michael Kay 的 Saxon-HE Java 库 xpath3

或者您可以使用高级语言和适当的库,我认为:

lxml ( from lxml import etree )

XML::LibXMLXML::XPathXML::Twig::XPathHTML::TreeBuilder::XPath

检查这个例子

DOMXpath检查这个例子


检查: 使用带有 HTML 标签的正则表达式

在此处输入图片说明

这可能对你有用(GNU sed):

sed -i '/<artifactId>ARTIFACT<\/artifactId>/{n;s/\S.*/<version>NEW_VERSION<\/version>/}' file

使用第一个非空白字符作为替换字符串的起始位置,用新版本覆盖旧版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM