Regex sed编辑文件上的一行
我有一个行值需要在文件上更新Regex sed编辑文件上的一行,regex,shell,sed,Regex,Shell,Sed,我有一个行值需要在文件上更新 export const ADDRESS_ORIGIN = 'chupa-cabra.muz.id'; 我正在尝试使用以下内容进行更新: sed -i '' 's/ADDRESS_ORIGIN ="[0-9.]*"/ADDRESS_ORIGIN ="'chapuza'"/' constants.js 但它的价值 地址来源 没有更新,我认为我的正则表达式是非常错误的,我如何更新值 谢谢 没有办法“[0-9.]*”可以匹配“chupa-cabra.muz.id”,但
export const ADDRESS_ORIGIN = 'chupa-cabra.muz.id';
我正在尝试使用以下内容进行更新:
sed -i '' 's/ADDRESS_ORIGIN ="[0-9.]*"/ADDRESS_ORIGIN ="'chapuza'"/' constants.js
但它的价值
地址来源
没有更新,我认为我的正则表达式是非常错误的,我如何更新值
谢谢 没有办法“[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
当然,在一般情况下,双引号与单引号具有不同的语义,因此,如果脚本使用的字符在切换引号时会被shell损坏,则需要在它们之前添加反斜杠,或者切换到我上面描述的“跷跷板引用”机制。但在这种特殊情况下,您的示例脚本不需要任何修改来适应双引号。我假设您使用的是
macOS
,因为您使用的是就地编辑方式;这应该起作用:
结果:
export const ADDRESS_ORIGIN = 'chapuza';
为什么要这样做?您错过了等号后面的空格,双引号
“
将直接匹配双引号而不是单引号”
,并且[0-9.]*
将匹配连续的数字和点
除了令人困惑的引号交替使用外,另一种方法是在正则表达式中使用ASCII:
sed 's/ADDRESS_ORIGIN *= *\x27[^\x27]*\x27/ADDRESS_ORIGIN = \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';
请参阅:请注意,sed-E
也依赖于平台;一些系统需要sed-r
,而另一些系统根本不提供扩展正则表达式支持。遗憾的是,像\x27
这样的十六进制表示法并不是所有sed
变体都支持的。@tripleee啊……是的,遗憾的是一些sed不支持它,它太方便了。好吧,我想当它被支持时,作为一种选择。
sed -E 's/(ADDRESS_ORIGIN) *= *([\x27\x22])[^\039\034]*\2/\1 = \x27chapuza\x27/'
$ 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';