【问题标题】:Find string and replace line in linux在linux中查找字符串并替换行
【发布时间】:2014-09-08 13:36:58
【问题描述】:

我想执行以下操作,但似乎找不到优雅的方法。

我有一个如下所示的文本文件:

..more values
stuff = 23   
volume = -15
autostart = 12
more values..

现在“音量”值可能会根据情况发生变化。我需要一个脚本,它可以找到带有“volume = xxx”的文本行,然后将其替换为“volume = 0”行。对此有什么优雅的解决方案?正文中的这一行不保证是第一行,所以需要先找到方法。

【问题讨论】:

  • 当我写下我的答案并在 shell 中进行测试时,其他三个已经出局了。我生锈了!
  • @zladuric 我们只是没有测试它们:-\

标签: linux replace sed find


【解决方案1】:
sed 's/^volume =.*/volume = 0/g' file.txt

【讨论】:

  • 感谢您的回答,我需要通过管道将其重新输入到文件中吗?
  • @jliu83 不要将其直接通过管道传输到文件中。您可以将其通过管道传输到一个新文件,然后您可以使用 mv 将原始文件替换为新文件。
  • 谢谢,我可能会问,为什么我不应该通过管道传输到同一个文件?我猜是关于读取和写入同一个文件的某种竞争条件?
  • @jliu83 类似的东西。另请注意,sed 具有用于“就地”修改文件的-i 选项,但它实际上也创建了一个临时文件。为了安全起见,我将从我展示的命令开始,如果您对输出感到满意,可以添加 -i 选项。
  • 另外,你能解释一下.*的用法吗?我在这里理解它意味着任何以音量开头的东西,但为什么不只是*,为什么会有句号(即,为什么.* 不是*)?
【解决方案2】:

使用 sed 你可以说:

sed '/^volume/s/.*/volume = 0/' infile

【讨论】:

  • 你能解释一下吗?通常在分隔符之前使用“s”选项进行替换。
  • 第一个/regex/ 决定以下命令应用于哪一行,在这种情况下,任何以volume 开头的行。
【解决方案3】:

将内容输入此命令:

sed -e 's/^volume\s*=\s*-\?[0-9]\+$/volume = 0/'

【讨论】:

    【解决方案4】:

    sed 's/^volume=\(.*\)$/volume=1/g' inputfile

    【讨论】:

      【解决方案5】:

      @jliu83,阅读正则表达式。这将使 sed 命令中的模式匹配更容易理解。

      http://en.wikipedia.org/wiki/Regular_expression

      【讨论】:

      • 这不是问题的答案
      猜你喜欢
      • 2018-08-29
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      • 2015-08-23
      • 1970-01-01
      相关资源
      最近更新 更多