sed编辑文件上的一行

时间:2019-02-14 06:42:42

标签: regex shell sed

我有一个需要在文件上更新的行值,

export const ADDRESS_ORIGIN = 'chupa-cabra.muz.id';

我正在尝试更新:

sed -i '' 's/ADDRESS_ORIGIN ="[0-9.]*"/ADDRESS_ORIGIN ="'chapuza'"/' constants.js

但是

的值
  

ADDRESS_ORIGIN

未更新,我认为我的REGEX非常错误,如何更新值?

谢谢!

3 个答案:

答案 0 :(得分:2)

"[0-9.]*"无法匹配'chupa-cabra.muz.id',但是如果不知道允许的值,我们只能推测。尽管您需要了解shell引用的机制以便正确地将其传递到'[^']*',也许sed会做您想要的事情。在这种情况下,到目前为止,最简单的方法是在sed脚本周围使用双引号而不是单引号:

sed -i '' "s/ADDRESS_ORIGIN = *'[^']*'/ADDRESS_ORIGIN = 'chapuza'/" constants.js

尽管您知道自己在做什么,也可以使用单引号和双引号交替进行:

sed -i '' 's/ADDRESS_ORIGIN = *'"'[^']*'"'/ADDRESS_ORIGIN = '"'chapuza'/" constants.js

这里的基本机制是,相邻的字符串将被外壳粘合在一起成为一个字符串。因此"a"'b'是双引号a,后跟单引号b。 Shell完成解析之后,您将获得字符串ab。现在,为了好玩,假设a是文字单引号,而b是文字双引号。

...也许您只想替换点之前的第一个标记?然后'[^.']*\.将匹配,并且您要替换为'chapuza.或使用向后引用'[^.']*\(['.]\)并替换为'chapuza\1

当然,在一般情况下,双引号的语义与单引号不同,因此,如果您的脚本使用的字符在切换引号时会被外壳破坏,则需要在它们之前添加反斜杠,或切换到我上面介绍了“跷跷板报价”机制。但是在这种情况下,示例脚本不需要进行任何修改即可适应双引号。

答案 1 :(得分:1)

由于您使用就地编辑的方式,我认为您在macOS上; 这应该可行

sed -E -i '' "s@(ADDRESS_ORIGIN = )'.*'@\1'chapuza'@g"

结果

export const ADDRESS_ORIGIN = 'chapuza';

答案 2 :(得分:1)

为什么要这么做?
您错过了等号后的空格,双引号"将在字面上匹配双引号,而不是单引号',并且[0-9.]*将匹配连续的数字和点。

替代令人困惑的引号,可以在正则表达式中使用ASCII:

sed 's/ADDRESS_ORIGIN *= *\x27[^\x27]*\x27/ADDRESS_ORIGIN = \x27chapuza\x27/'

sed 's/\(ADDRESS_ORIGIN\) *= *\x27[^\x27]*\x27/\1 = \x27chapuza\x27/'

或更妙的是,由于值周围可能会有双引号,因此您可以通过以下两种方式考虑这两种情况:

sed -E 's/(ADDRESS_ORIGIN) *= *([\x27\x22])[^\039\034]*\2/\1 = \x27chapuza\x27/'

在RegEX中\x27 = \039 = '\x22 = \034 = "的地方。

赞:

$ echo export const ADDRESS_ORIGIN = \"chupa-cabra.muz.id\"\;|sed -E 's/(ADDRESS_ORIGIN) *= *([\x27\x22])[^\039\034]*\2/\1 = \x27chapuza\x27/'
export const ADDRESS_ORIGIN = 'chapuza';