0

我正在尝试使用 sed 更改服务器上 site.js 文件中的变量。

这里是一行:var url = "page.php";我想用 page.php 代替whatever.php。

我认为这将非常简单,并且我认为这将毫无问题地工作:

sed -i "s/\url = \".*\"/\url = \"page2.php\"/" /home/site.js

它工作正常,除了得到:var url = "page2.php";我得到:var R1 = "page2.php";

为什么我在这里使用 sed 时 url 值被更改为 R1?

4

3 回答 3

2

\你以前不需要url

sed -i -r 's#url\s*=\s*"[^"]+"#url = "page2.php"#' /home/site.js

"可以通过将 sed 表达式与'而不是括起来来消除额外的转义"

当字符串本身可能包含时,最好使用与/(此处)不同的分隔符#/

于 2013-10-26T19:02:35.750 回答
1

尝试这样做:

sed -i -r 's@(var\s+url\s*=\s*")[^"]+"@\1whatever.php"@' file.js

/不是强制性的分隔符,我在那里捡到了@

于 2013-10-26T19:04:13.457 回答
1

这是另一个示例:我花了一段时间才发现您更改了/for 分隔符而不是 / 目录路径中的分隔符。

如果您有 dir 路径名,请使用@而不是/sed 分隔符。

首先我尝试了这个:

[root@ip-172-35-24-37 ec2-user]# egrep -q "^(\s*\S+\s+)/dev/shm(\s+\S+\s+\S+)(\s+\S+\s+\S+)(\s*#.*)?\s*$" /etc/fstab && sed -ri "s/^(\s*\S+\s+)/dev/shm(\s+\S+\s+\S+)(\s+\S+\s+\S+)(\s*#.*)?\s*$/\1/dev/shm\2nodev\3\4/" /etc/fstab

并得到这个错误:

sed: -e expression #1, char 20: unknown option to `s'

因此,我使用@了 sed 分隔符而不是/

[root@ip-172-35-24-37 ec2-user]# egrep -q "^(\s*\S+\s+)/dev/shm(\s+\S+\s+\S+)(\s+\S+\s+\S+)(\s*#.*)?\s*$" /etc/fstab && sed -ri "s@^(\s*\S+\s+)/dev/shm(\s+\S+\s+\S+)(\s+\S+\s+\S+)(\s*#.*)?\s*$@\1/dev/shm\2nodev\3\4@@" /etc/fstab
[root@ip-172-35-24-37 ec2-user]#

它奏效了。

@除了分隔符 之外,您还可以使用其他东西,例如!or?%/ 如果您有目录路径,请不要使用。

于 2016-03-10T22:58:25.653 回答