在不丢失其他行的情况下编辑文本中的部分行

Edit part of a line in text without losing other lines

我尝试将文本的tstop参数从120替换为80。我得到的是一行文本:tstop 80,丢失了其余文本。我用了

sed -i -rne 's/(tstop)\s+\w+/ 80/gip'

我只想更改行 tstop 并保持其余文本不变。

部分文字为:

[Grid]    
X1-grid    1     -6.0  24 u 6.0  
X2-grid    1     -24.   96 u 24.    
X3-grid    1     -18.0  72 u 18.0    
[Chombo Refinement]   
Levels           4     
Ref_ratio        2 2 2 2 2     
Regrid_interval  2 2 2 2     
Refine_thresh    0.3    
Tag_buffer_size  3    
Block_factor     8    
Max_grid_size    64    
Fill_ratio       0.75    
[Time]    
CFL              0.3    
CFL_max_var      1.1    
tstop            120    
first_dt         1.e-5    
[Solver]    
Solver         tvdlf

使用 GNU sed:

sed -E 's/^(tstop +)[^ ]*/0/' file

sed -E '/^tstop/s/[^ ]+$/80/' file

如果您想编辑文件 "in place" 使用 sed 的选项 -i


参见:The Stack Overflow Regular Expressions FAQ

-rne中的n标志抑制了sed命令的正常输出。使用 p 命令只会输出与您的模式匹配的行。试试这个:

sed -i -re 's/(tstop)\s+\w+/ 80/gi'

使用 BRE(基本正则表达式)的更便携的版本可能是:

sed -i -e 's/\(tstop\)\(  *\)[[:alnum:]]*/0/' file

请注意,tstop 之后的空格也会在此处捕获,以保留文件格式。 ig 修饰符在您的情况下似乎也没有用。