3

我有一个带有模板的输入文件,如下所示。我想更改版本:使用 sed。

    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

4 回答 4

10

你不需要grep。

sed -i '/Version/s/3\.1\.0\.2-1/3.1.0.2/' <files>
于 2012-06-06T19:48:36.703 回答
8

您想使用“-i”开关切换到 sed 用于“编辑文件 [I]n 位置”。

请参阅 sed 手册页:http ://unixhelp.ed.ac.uk/CGI/man-cgi?sed

于 2012-06-06T18:39:31.190 回答
4

这个名字的sed字面意思来自“Stream EDITor”——你看到的行为就是它的设计方式。当你说:

sed 'some commands' file

它读取文件,执行命令并打印结果 - 它不会将其保存回文件(尽管某些版本sed有一些选项可以告诉它这样做)。你可能想要这样做:

sed 'some commands' file > newfile

然后验证newfile是否正确,然后mv newfile file. 如果您绝对确定您的编辑脚本是正确的,并且您可以处理用错误数据覆盖文件的后果(如果不是),那么您可以考虑使用就地编辑标志,但通常保存起来更安全到一个临时文件,以便您可以测试/验证。

于 2012-06-06T18:26:53.793 回答
2

你有一个错字,最后一个点应该是一个破折号,试试这个:

sed 's/3.1.0.2-1/3.1.0.2-2/'
于 2012-06-06T18:06:12.940 回答