【问题标题】:Change a string in a file with sed?用sed更改文件中的字符串?
【发布时间】:2012-06-06 17:58:31
【问题描述】:

我有一个带模板的输入文件,如下所示。我想更改版本:使用 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

任何有关我如何实现此目的的帮助将不胜感激。最好我想更改版本而不获取文件中的当前版本。

提前致谢

【问题讨论】:

    标签: linux sed awk gawk


    【解决方案1】:

    你不需要 grep。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 抱歉错字是我在 bash 脚本中的错误,它是正确的。感谢您指出这一点。
        【解决方案4】:

        sed 这个名字的字面意思是“流编辑器”——你看到的行为就是它的设计方式。当你说:

        sed 'some commands' file
        

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

        sed 'some commands' file > newfile
        

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

        【讨论】:

        • 这是我的方法,有没有更好的方法?我发现 -i 不太信任
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 2019-09-16
        • 1970-01-01
        • 2016-09-09
        • 2021-11-03
        • 1970-01-01
        • 2022-01-17
        相关资源
        最近更新 更多