Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex sed编辑文件上的一行_Regex_Shell_Sed - Fatal编程技术网

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';