在linux中查找字符串并替换行

在linux中查找字符串并替换行,linux,replace,sed,find,Linux,Replace,Sed,Find,我想做以下几件事,但我似乎找不到一个优雅的方法来做 我有一个如下所示的文本文件: ..more values stuff = 23 volume = -15 autostart = 12 more values.. 现在,“体积”值可能会根据情况发生变化。我需要一个脚本,可以找到带有“volume=xxx”的文本行,然后将其替换为“volume=0”行。什么是一个优雅的解决方案?文本中的这一行不能保证是第一行,因此我需要一种先找到它的方法。使用sed,您可以说: sed '/^volum

我想做以下几件事,但我似乎找不到一个优雅的方法来做

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

..more values
stuff = 23   
volume = -15
autostart = 12
more values..
现在,“体积”值可能会根据情况发生变化。我需要一个脚本,可以找到带有“volume=xxx”的文本行,然后将其替换为“volume=0”行。什么是一个优雅的解决方案?文本中的这一行不能保证是第一行,因此我需要一种先找到它的方法。

使用sed,您可以说:

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

将内容导入此命令:

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

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


sed的/^volume=\(.*\$/volume=1/g”inputfile
当我写下答案并在shell中测试时,另外三个已经出来了。我快生锈了@zladuric我们只是没有测试他们:-\n你能解释一下吗?通常在分隔符之前使用“s”选项进行替换。第一个
/regex/
决定以下命令应用于哪一行,在这种情况下,任何以
卷开始的行都可以。感谢您的回答,我需要将其重新导入文件中。正确吗?@jliu83不要直接导入文件。您可以通过管道将其传输到一个新文件,然后可以使用
mv
将原始文件替换为新文件。谢谢,我想问一下,为什么不通过管道传输到同一个文件?我猜是关于读写同一个文件的某种竞争条件?@jliu83类似的东西。还请注意,
sed
具有用于“就地”修改文件的
-i
选项,但它实际上也创建了一个临时文件。为了安全起见,我从我显示的命令开始,如果您对输出满意,可以添加
-I
选项。另外,您可以解释
*
的用法吗?我在这里理解它意味着任何以体积开始的东西,但为什么不仅仅是
*
,为什么有一个句点(即为什么
*
不是
*
)?这不是问题的答案
sed -e 's/^volume\s*=\s*-\?[0-9]\+$/volume = 0/'