【问题标题】:Search for specific line of text file, replace up to a certain character搜索文本文件的特定行,最多替换某个字符
【发布时间】:2013-09-18 03:26:43
【问题描述】:

在文件my_file.ini 中,我想修改以dataspecs 开头的行,如下所示:

dataspecs old_val old stuff blah blah ! blah blah替换为

dataspecs $new_val ! blah blah,其中new_val 是一个bash 变量,! 之后的所有内容都被保留。另外,我不知道old_val的值。

我不在乎是sed 还是awk 或者只是bash,我只是在寻找一个我能理解的简单答案。对于刚刚学习 sed 和 awk 的人(不是最容易查看的代码),我真的很感激一个解决方案,特别是如果你能解释解决方案的代码意味着什么。谢谢!

【问题讨论】:

  • 请尝试我的 sed 命令。它不需要知道old_val的值。

标签: bash replace sed awk


【解决方案1】:

使用 sed:

sed -i.bak "s/^\( *dataspecs \)[^\!]*/\1${new_val} /" my_file.ini

PS:我正在使用 sed 的内联标志-i 进行内联编辑,这将保存修改后的文件。

【讨论】:

  • 我忘了说,我不知道old_val是什么!
  • 很好,除了我们可以替换dataspecs! 之间的anything 吗?旧值可能不止一个,也可能是几个用空格分隔的值。同样,我应该更清楚地开始。我会更新我的帖子。
  • 几乎完美,除了!之前可以留一个空格吗?
【解决方案2】:

我建议使用这种形式的 sed:

sed "s/^\\(dataspecs \\)[^!]*\\( !.*\\)/\\1${new_val}\\2/" my_file.ini

如果要直接修改文件,请添加-i选项。

sed -i "s/^\\(dataspecs \\)[^!]*\\( !.*\\)/\\1${new_val}\\2/" my_file.ini

【讨论】:

  • 非常感谢,我了解了基本的 sed 结构 sed -i s///,但是请您解释一下括号、\\ 和 2 是怎么回事?
  • 在它的基本格式中,它是's/^\(dataspecs \)[^!]*\( !.*\)/\1new_value\2/',但我们必须为"" 引用它的某些部分。 \(x\)\(y\) 的所有匹配项在 \1\2 的替换字符串中都有它们的位置,因此它们可以匹配的任何内容都将放置在那里。这类似于使用 & 替换所有匹配项。
  • 该错误与历史扩展有关。它仅适用于您在 bash 中进行交互时,而不是在脚本中。您可以使用 shopt -u -o histexpand 暂时禁用它。
【解决方案3】:
awk '/dataspecs old_val/ {$2="$new_val"}1' my_file.ini

【讨论】:

  • 我忘了说,我不知道old_val是什么!
  • 那就是awk '/dataspecs/ {$2="$new_val"}1' my_file.ini
猜你喜欢
  • 1970-01-01
  • 2022-11-19
  • 2012-09-28
  • 2017-01-16
  • 2020-09-14
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多