【问题标题】:Sed: How to replace a string found after a specific pattern is located in a fileSed:如何替换在特定模式位于文件中之后找到的字符串
【发布时间】:2013-11-13 06:45:38
【问题描述】:

如果我在文件中有以下列表:

integer, parameter :: ni = 1024
integer, parameter :: nj = 256
integer, parameter :: nk = 16

并想根据字符串'ni ='进行搜索,然后将后面的字符串(在本例中为'1024')替换为例如'512'之类的新字符串(我想保留空格) .我该如何使用 sed 呢?请注意,我想基本上擦除等号之后的任何内容,这是因为有时字符串不是简单的整数,它可能类似于“1.D0”。在某些情况下,前面可能有 cmets。所以我只想清除等号前面的所有内容并替换为新值。

结果是:

integer, parameter :: ni = 512
integer, parameter :: nj = 256
integer, parameter :: nk = 16

【问题讨论】:

    标签: regex linux bash unix sed


    【解决方案1】:

    如果你给它-r 标志,GNU sed 支持扩展正则表达式。

    sed -re 's/(:: ni =)[^=]*$/\1 512/' file
    

    更好的是,匹配多个空格。

    sed -re 's/(::\s+ni\s+=)[^=]*$/\1 512/' file
    

    \1 是对括号 ( ) 中匹配内容的引用,因此我们将其替换为 \1 和一个新值。

    【讨论】:

    • 如果是ni:1024 怎么办?没有空格
    【解决方案2】:

    如果我理解正确,应该这样做:

    sed 's/\(ni = \).*/\1REPLACEMENT/'

    【讨论】:

      【解决方案3】:
      sed -e 's/:: ni = [0-9][0-9]*$/:: ni = 512/'
      

      这会在指定的匹配项周围寻找合理的上下文,以最大程度地减少在另一个字符串中的某处找到ni 的机会。

      【讨论】:

      • 最好写sed -e 's/:: ni = [0-9]+$/:: ni = 512/'
      • @AntonAstafiev:这取决于您希望代码的工作范围。 sed 的某些变体支持+,无需进一步切换;许多人不这样做,POSIX 也不要求他们这样做。你可以用[0-9]\{1,\}来做,但是我写的更容易理解。
      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 2020-03-06
      • 2017-02-21
      • 2016-04-29
      • 2019-11-21
      • 1970-01-01
      • 2014-08-19
      • 2018-08-20
      相关资源
      最近更新 更多