在文本中编辑行的一部分而不会丢失其他行

时间:2017-03-04 07:46:55

标签: linux awk sed ex

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

sed -i -rne 's/(tstop)\s+\w+/\1 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

2 个答案:

答案 0 :(得分:0)

使用GNU sed:

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

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

如果您要“就地”修改文件,请使用sed的选项-i

请参阅:The Stack Overflow Regular Expressions FAQ

答案 1 :(得分:0)

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

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

使用BRE(Basic Regular Expresssions)的更便携版本可以是:

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

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