我有一份文件
public class Constants {
public static final String PACKAGE_VERSION = '1.24.0.1';
}我正在执行脚本
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来内联编辑文件吗?
当我试图执行命令时
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,而不是对当前文件进行内联修改,并且新文件不具有替换性。
当我试图执行命令时
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 我收到一个错误
sed: 1: "force-app/main/default/ ...": invalid command code f我希望脚本在不改变脚本的情况下在MacOS和Linux中都能工作。
我试图使用awk,但是我不知道如何使它内联地编辑文件?
当我尝试执行以下操作时
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这使得我的文件空白。
发布于 2022-05-31 15:43:11
-iE意味着使用扩展名"E"备份文件。你必须使用:
sed -i.old -E ...要将文件filename备份到filename.old,请执行以下操作。
在阅读了注释和使用您的环境(macOS)进行的更新之后,我添加了几个链接,在这些链接中您可以找到关于sed在-i中的使用的有用信息:
另外,如果您想要替换该版本,那么它可能更易于用awk阅读:
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注意:您不能使用输入文件作为目标,因为它将被截断,这就是您在文章末尾提到的。临时文件用于帮助。
通常,我更喜欢在使用awk或sed时使用临时文件,而不是使用它们的就地选项(对于GNU awk)。上面的命令在您的两个环境中都可以使用。
发布于 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。(以后总是可以删除备份文件。)
发布于 2022-05-31 16:48:31
不同的sed实现复制了perl的-i选项以进行就地编辑,但不幸的是,它们之间有不同的API。
一些人还添加了一个-E或-r来支持(高级的)扩展regexps (POSIX或其变体),一些-R或-P用于偶数(非常)高级的类perl的regexps (PCRE或类似的),但是再次(除了会进入POSIX标准的下一个版本的-E之外,现在在越来越多的实现中找到了),没有什么通用的。
在这里,您最好使用真实的东西,并避免所有这些可移植性问题:
perl -i -pe "s{\bPACKAGE_VERSION\s*=\s*\K'\d+(\.\d+){3}'}{'1.24.0.3'}g" filehttps://unix.stackexchange.com/questions/704505
复制相似问题