首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在sed中可以同时使用-i和-E选项吗?

在sed中可以同时使用-i和-E选项吗?
EN

Unix & Linux用户
提问于 2022-05-31 15:32:13
回答 3查看 253关注 0票数 0

我有一份文件

代码语言:javascript
复制
public class Constants {
    public static final String PACKAGE_VERSION = '1.24.0.1';
}

我正在执行脚本

代码语言:javascript
复制
sed -E "/PACKAGE_VERSION/s/\'([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\'/\'1.24.0.2\'/g" force-app/main/default/classes/Constants.cls > temp.cls
mv temp.cls force-app/main/default/classes/Constants.cls

将字符串“1.24.0.1”替换为“1.24.0.2”

用一行就能做到这一点吗?我应该使用awk而不是sed来内联编辑文件吗?

当我试图执行命令时

代码语言:javascript
复制
sed -iE "/PACKAGE_VERSION/s/\'([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\'/\'1.24.0.3\'/g" force-app/main/default/classes/Constants.cls 

创建文件Constants.clsE,而不是对当前文件进行内联修改,并且新文件不具有替换性。

当我试图执行命令时

代码语言:javascript
复制
sed -Ei "/PACKAGE_VERSION/s/\'([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\'/\'1.24.0.3\'/g" force-app/main/default/classes/Constants.cls 

我收到一个错误

代码语言:javascript
复制
sed: 1: "force-app/main/default/ ...": invalid command code f

我希望脚本在不改变脚本的情况下在MacOS和Linux中都能工作。

我试图使用awk,但是我不知道如何使它内联地编辑文件?

当我尝试执行以下操作时

代码语言:javascript
复制
awk -v v="$version" '/PACKAGE_VERSION/{gsub(/[0-9]+(.[0-9]+){3}/,v)}1' force-app/main/default/classes/Constants.cls > force-app/main/default/classes/Constants.cls

这使得我的文件空白。

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2022-05-31 15:43:11

-iE意味着使用扩展名"E"备份文件。你必须使用:

代码语言:javascript
复制
sed -i.old -E ...

要将文件filename备份到filename.old,请执行以下操作。

在阅读了注释和使用您的环境(macOS)进行的更新之后,我添加了几个链接,在这些链接中您可以找到关于sed-i中的使用的有用信息:

另外,如果您想要替换该版本,那么它可能更易于用awk阅读:

代码语言:javascript
复制
awk -v v='1.24.0.2' '
  /PACKAGE_VERSION/{gsub(/[0-9]+(\.[0-9]+){3}/,v)}1
' force-app/main/default/classes/Constants.cls > file.tmp &&
  mv file.tmp force-app/main/default/classes/Constants.cls

注意:您不能使用输入文件作为目标,因为它将被截断,这就是您在文章末尾提到的。临时文件用于帮助。

通常,我更喜欢在使用awksed时使用临时文件,而不是使用它们的就地选项(对于GNU awk)。上面的命令在您的两个环境中都可以使用。

票数 1
EN

Unix & Linux用户

发布于 2022-05-31 16:17:28

在一些seds中(至少在FreeBSD和Mac上),-i选项采用一个强制参数,该参数设置用于备份文件的后缀。您可以在shell中编写-i.suffix-i .suffix,或者编写-i ""以不提供后缀。在这种情况下,-iE-i -E都会将E-E作为-i的参数,而不是一个选项。

在其他一些seds中(至少是GNU和Busybox),-i选项为后缀接受一个可选参数,因此在相同的命令行参数字符串中它后面的任何内容都是后缀。在文档中,它通常以-i[suffix]的形式表示。您可以在shell中编写-i.suffix,或者只编写-i以不提供后缀。在那些-iE中,E仍然是后缀,但是-i -E作为两个选项工作。

在这两种情况下,-iE都意味着使用后缀E,而在FreeBSD/Mac中,-Ei ...使用下面的参数作为后缀(在这个后缀中放置您的程序)。

如果要为没有备份文件提供空后缀,这两种方法是不兼容的。在这种情况下,您必须知道不同之处,并在FreeBSD/Mac中使用-i "" -E,或者在GNU中使用-i -E

或者,如果您想要备份文件或不关心,只需在其中使用-i.bak -E。(以后总是可以删除备份文件。)

另见-i (就地编辑)实现可移植性?)

票数 4
EN

Unix & Linux用户

发布于 2022-05-31 16:48:31

不同的sed实现复制了perl-i选项以进行就地编辑,但不幸的是,它们之间有不同的API。

一些人还添加了一个-E-r来支持(高级的)扩展regexps (POSIX或其变体),一些-R-P用于偶数(非常)高级的类perl的regexps (PCRE或类似的),但是再次(除了会进入POSIX标准的下一个版本的-E之外,现在在越来越多的实现中找到了),没有什么通用的。

在这里,您最好使用真实的东西,并避免所有这些可移植性问题:

代码语言:javascript
复制
perl -i -pe "s{\bPACKAGE_VERSION\s*=\s*\K'\d+(\.\d+){3}'}{'1.24.0.3'}g" file
票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/704505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档