使用sed在文件中替换字符串?

3

我有一个带有以下模板的输入文件,我想用sed更改Version:

    Package: somename
    Priority: extra
    Section: checkinstall
    Maintainer: joe@example.com
    Architecture: i386
    Version: 3.1.0.2-1
    Depends:
    Provides: somename
    Description: some description

目前我正在使用grep -m 1 Version inputfile | sed 's/[:_#a-zA-Z\s"]*//g'获取当前版本,并尝试用sed 's/3.1.0.2-1/3.1.0.2/' inputfile替换当前版本。

然而这似乎不起作用,但我在命令行中尝试使用echo时它是有效的。echo 'Version: 3.0.9.1' | sed 's/3.0.9.1/3.2.9.2/'

Output: Version: 3.2.9.2

任何关于如何实现这一点的帮助都将不胜感激。最好是在不获取文件中当前版本的情况下更改版本。谢谢!
4个回答

10

您不需要使用grep。

sed -i '/Version/s/3\.1\.0\.2-1/3.1.0.2/' <files>

8

4
名称sed源自“流编辑器”的意思-您所看到的行为就是它设计的方式。当您说:
sed 'some commands' file

它读取文件,执行命令并打印结果 - 它不会将其保存回文件中(虽然某些版本的sed具有一些选项可告诉它执行此操作)。您可能想要执行以下操作:

sed 'some commands' file > newfile

首先验证newfile是否正确,然后执行mv newfile file。如果您非常确信您的编辑脚本是正确的,并且可以处理覆盖文件的错误数据的后果,那么您可以考虑使用原地编辑标志,但通常更安全的方法是保存到临时文件中以便测试/验证。


这是我的方式,有更好的方式吗?我发现-i不太可靠。 - Zen

2

您有一个打字错误,最后的点应该是破折号,请尝试这样:

sed 's/3.1.0.2-1/3.1.0.2-2/'

抱歉,我的 Bash 脚本中的拼写错误是我的错。不过感谢你指出来。 - ShreyasD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接