替换为以 sed 开头的字符串的多个空格

Replace with multiple spaces starting a string with sed

我在/etc/hosts中有输入:

127.0.0.1 fake.hostname.net   fake

我想用 real 替换第二个 fake。以下 sed 语句试图通过匹配之前的两个 space 来过滤两者,但它什么也不做:

sed -i -e 's/  fake/  new/g' /etc/hosts

结果是:

127.0.0.1 fake.hostname.net   fake

预期结果是:

127.0.0.1 fake.hostname.net   new

我也尝试了以下相同的结果:

sed -i -e 's/\s\sfake/\s\snew/g' /etc/hosts

为什么会发生这种情况,我该如何解决?我是运行Ubuntu14.04.1服务器。我不想简单地替换第二场比赛,因为我期待这样的事情:

127.0.0.1 asdf.hostname.net   fake

也是,所以space匹配是唯一可以接受的方法。

echo "127.0.0.1 fake.hostname.net   fake" | sed -e 's/  fake/  new/g'

Returns 预期的结果,但是同样的语句没有写入文件。只是不把额外的 spaces 放在写入文件的语句中,所以这不是文件系统权限问题。

应该是

sed -i 's/fake$/real$/' /etc/hosts

$ 匹配行尾。您不需要 g 选项,因为每行只有一个匹配项。