sed 修改文件

  1. Section 1
  2. Section 2
  3. Section 3

Section 1

$ sed -i '3s/0.01/0.02/g' INCAR

精解:

  1. 单引号中是我们的操作, 3s 表示的是选择第三行,因为我们知道 0.01 在第三行中出现,s 是substitute 的缩写;

  2. 3s 后面跟一个斜杠 / 用来和后面被替换的内容分开,这里0.01 表示选择第三行的0.01;

  3. 0.01后面再用一个斜杠,将其和替换后的数字分开(0.01 0.02 0.03 等),表示将0.01替换为斜杠后面的内容;

  4. 再加一个斜杠,后面的g 代表 global ,意思是全部替换。

  5. 输入完毕后,我们选择要执行该命令的对象(要替换的文件),也就是当前目录下INCAR 文件。

  6. 命令的意思就是:我们用sed命令,将INCAR中的第三行的0.01全部替换成0.02。

  7. -i 表示直接对源文件进行编辑,也就是说编辑之后源文件被新文件替换掉。因此,使用这个参数的时候要小心,小心,再小心。要格外小心!!!

Section 2

在课题刚刚开始的时候,就把slab模型中的原子按照层数(也就是z方向的大小)进行排列,前面我们讲过怎么sort坐标了,这里就不再啰嗦。

排列后的一个优势就是各个层的原子在POSCAR中的序号是连续的,可以很方便地进行选择然后通过使用sed 命令将POSCAR里面的T T T 批量转化为 F F F.

比如本例中:10-45为Ru原子,10-18, 19-27, 28-36, 37-45 从上往下数,分别对应第一、二、三、四层的Ru原子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Ru   H
1.00000000000000
8.1377999784000004 0.0000000000000000 0.0000000000000000
4.0688999892000002 7.0475415119999996 0.0000000000000000
0.0000000000000000 0.0000000000000000 21.5631999968999999
Ru H
36 1
Selective dynamics
Direct
0.2212968850718230 0.2239409561475650 0.2936169649913790 F F F
0.2210036114118170 0.5561663540453879 0.2936884876706930 F F F
0.2212954084343650 0.8880992570872690 0.2936171801115680 F F F
0.5547059120221930 0.2208073369214740 0.2945957656788490 F F F
0.5547051050620690 0.5578229108467880 0.2945953069057910 F F F
0.5572530259134471 0.8880427972121010 0.2935860240494040 F F F
0.8910551675972660 0.2211397177458350 0.2944546614649750 F F F
0.8893412673473050 0.5559102687354450 0.2935156586054220 F F F
0.8893404937786400 0.8880862995751930 0.2935168781920150 F F F
0.1119432861914480 0.1106972088633780 0.1977748273385700 F F F
0.1112675774095350 0.4441060896203480 0.1977506775579700 F F F
0.1112675246777360 0.7779649556723670 0.1977514668340350 F F F
0.4440066349954530 0.1106943439331120 0.1977106006833940 F F F
0.4446549772136020 0.4443417041956370 0.1981365664070010 F F F
0.4440061461204080 0.7786377563630820 0.1977110173547200 F F F
0.7777009262273890 0.1113226147079440 0.1980782640541890 F F F
0.7777006933574599 0.4443146361556100 0.1980780083860340 F F F
0.7774653980933121 0.7779366397494840 0.1977260420610920 F F F
0.2222233413377670 0.2222233413358840 0.0992873228095945 F F F
0.2222233413377670 0.5555566746692190 0.0992873228095945 F F F
0.2222233413377670 0.8888900080025550 0.0992873228095945 F F F
0.5555566746710950 0.2222233413358840 0.0992873228095945 F F F
0.5555566746710950 0.5555566746692190 0.0992873228095945 F F F
0.5555566746710950 0.8888900080025550 0.0992873228095945 F F F
0.8888900080044310 0.2222233413358840 0.0992873228095945 F F F
0.8888900080044310 0.5555566746692190 0.0992873228095945 F F F
0.8888900080044310 0.8888900080025550 0.0992873228095945 F F F
0.1111100016643290 0.1111100016603930 0.0000000000000000 F F F
0.1111100016643290 0.4444433349937280 0.0000000000000000 F F F
0.1111100016643290 0.7777766683270571 0.0000000000000000 F F F
0.4444433349976650 0.1111100016603930 0.0000000000000000 F F F
0.4444433349976650 0.4444433349937280 0.0000000000000000 F F F
0.4444433349976650 0.7777766683270571 0.0000000000000000 F F F
0.7777766683310010 0.1111100016603930 0.0000000000000000 F F F
0.7777766683310010 0.4444433349937280 0.0000000000000000 F F F
0.7777766683310010 0.7777766683270571 0.0000000000000000 F F F
0.6419725686006360 0.3456803556224560 0.3432239557346220 T T T

在上面POSCAR基础上,放开上面的2层:

$ sed –i '10,27s/F/T/g' POSCAR

固定所有的Ru原子,可以:

$ sed –i '10,45s/T/F/g' POSCAR

Section 3

更一般的是匹配模式修改文件。

sed -i '/NFREE/s/^# //' INCAR ##取消注释NFREE

在这个命令中,/NFREE/ 是一个模式,表示匹配包含 “NFREE” 的行。s/^# // 是替换命令,将以 “#” 开头的行的开头的注释符号 “# “ 替换为空,即去掉注释符号。

sed -i '/^NCORE/s/^/#/' INCAR     ##添加注释

^NCORE表示匹配以 “NCORE” 开头的行。
s/^/#/:这是替换命令,将匹配到的行的开头加上注释符号 “# “。

sed -i '/^IBRION/s/.*/IBRION = 5/' INCAR  ##修改参数

/^IBRION/:这是一个模式,表示匹配以 “IBRION” 开头的行。
s/./IBRION = 5/:这是替换命令,将匹配到的行替换为 “IBRION = 5”。其中,./ 表示匹配任意字符序列,而 IBRION = 5 是替换的内容。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。