【问题标题】:Replace with multiple spaces starting a string with sed用多个空格替换以 sed 开头的字符串
【发布时间】: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 也会对双倍空格产生影响。

标签: regex bash sed


【解决方案1】:

应该是

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

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

【讨论】:

  • 这解决了我的问题,谢谢。不过,我仍然想知道空间行为。
  • 可能是tab
  • 我确定这是一个空格,甚至通过十六进制转储运行它。
  • 这将替换 127.0.0.1 fake 中的 fake,但这可能不会导致任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 2014-09-05
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多