sed 和 sudo 以及字符串替换

rɑː*_*dʒɑ 3 shell bash sudo sed

我想用 sed 替换字符串并将更改保存到需要 sudo 作为根拥有的文件的同一文件。

但在这样做时我遇到了以下错误

raja@raja-UbuntuVM:~$ sudo sed 's|gateway 192.168.56.1| |g' /etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
iface eth1 inet static
        address 192.168.56.102
        netmask 255.255.255.0

-bash: syntax error near unexpected token `newline'
raja@raja-UbuntuVM:~$ sudo sed 's|gateway 192.168.56.1| |g' /etc/network/interfaces > /etc/network/interfaces
-bash: /etc/network/interfaces: Permission denied
Run Code Online (Sandbox Code Playgroud)

Rob*_*rtL 6

sudo sed 's|gateway 192.168.56.1| |g' /etc/network/interfaces > /etc/network/interfaces
Run Code Online (Sandbox Code Playgroud)

这会失败,因为您当前的(非)shell 尝试在执行之前sudo打开该interfaces文件。sudo要解决此问题,请使用以下的-i(就地编辑)选项sed

sudo sed -i 's|gateway 192.168.56.1| |g' /etc/network/interfaces
Run Code Online (Sandbox Code Playgroud)

同时编辑和替换文件。

  • 更糟糕的是,即使权限允许您“> /etc/network/interfaces”,它也会删除文件的内容,因为 shell 重定向发生在“sed”命令运行之前**...`sed ` 将有一个空的输入文件并生成一个空的输出文件。这就是为什么您必须使用“-i”进行就地编辑,或者如果您的“sed”版本不支持“-i”,则必须使用 tmpfile。 (2认同)