我有一个需要在文件上更新的行值,
export const ADDRESS_ORIGIN = 'chupa-cabra.muz.id';
我正在尝试更新:
sed -i '' 's/ADDRESS_ORIGIN ="[0-9.]*"/ADDRESS_ORIGIN ="'chapuza'"/' constants.js
但是
的值ADDRESS_ORIGIN
未更新,我认为我的REGEX非常错误,如何更新值?
谢谢!
答案 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';