替换为以 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
选项,因为每行只有一个匹配项。
我在/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
选项,因为每行只有一个匹配项。