2017-03-04 74 views
0

我试图将文本的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 
+0

你不需要替代品上的'g'后缀;线上只会有一个'tstop'字段。 –

回答

0

与GNU的sed:

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

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

如果你想编辑文件 “就地” 用sed的选项-i


参见:The Stack Overflow Regular Expressions FAQ

+0

这正是我想要的。我只有1个问题是什么意思*/\ 180 /所以我更好地理解sed是如何工作的。 – Spirtoylis

+0

圆括号'()'表示一个捕获组,'\ 1'表示在这里使用来自第一捕获组的值。 – Cyrus

0

n标志-rne抑制sed命令的正常输出。只有符合您的模式的行才会与您的p命令一起输出。试试这个:

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

使用BRE(基本正Expresssions)更便携版可能是:

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

注意tstop后的空间也在这里拍摄,保存的文件格式。另外ig修饰符在你的情况下似乎没用。

相关问题