7

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

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

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

结果将是:

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

3 回答 3

11

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

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

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

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

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

于 2013-11-02T00:15:59.197 回答
5

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

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

于 2013-11-02T00:13:01.897 回答
1
sed -e 's/:: ni = [0-9][0-9]*$/:: ni = 512/'

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

于 2013-11-02T00:11:05.630 回答