【发布时间】:2015-03-30 03:20:44
【问题描述】:
我在 /etc/hosts 中有输入:
127.0.0.1 fake.hostname.net fake
我想用real 替换第二个fake。以下 sed 语句尝试通过匹配之前的两个空格来过滤两者,但它什么也不做:
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
为什么会发生这种情况,我可以做些什么来解决它?我正在运行 Ubuntu 14.04.1 服务器。我不想简单地替换第二场比赛,因为我期待这样的事情:
127.0.0.1 asdf.hostname.net fake
同样,所以空间匹配是唯一可接受的方法。
echo "127.0.0.1 fake.hostname.net fake" | sed -e 's/ fake/ new/g'
返回预期结果,但同一语句不写入文件。只是不在语句中添加额外的空格写入文件,所以这不是文件系统权限问题。
【问题讨论】:
-
如果您使用
cat:cat /etc/hosts | sed -e 's/ fake/ new/g',您能否确认表达式按预期工作?另外,确认空格实际上是空格,而不是制表符? -
@WilliBallenthin 确实如此:
echo "127.0.0.1 fake.hostname.net fake" | sed -e 's/ fake/ new/g'是的,它是空格,而不是制表符。如果我不在表达式中添加空格,则文件会更新,因此这不是权限问题。即使在代码格式中,Stack Overflow 也会对双倍空格产生影响。