在已知字符串和未知十进制数之间搜索不同行号的模式

时间:2016-08-11 14:38:33

标签: shell awk sed scripting

我想在已知字符串和文件中不同行的未知十进制数字之间搜索模式。

假设我们必须搜索模式并替换为同一文件中的另一个模式:

实施例。文件包含以下内容:

###line 1..
###line 2..
###line 3..
known_string 
###line 5
###line 6
4444
###line 8
###line 9
###line 10
unknown_string 
###line 11
###line 12
6666
unknown_string 
###line 15
###line 16
5555
EOF

在上面的例子中,我必须从文件中搜索一个模式。

known_string
###line 5
###line 6
4444

并且必须替换为同一文件中的另一个模式:

known_string 
###line 5
###line 6
8850  

因此,输出应采用以下格式:

###line 1..
###line 2..
###line 3..
known_string 
###line 5
###line 6
8850
###line 8
###line 9
###line 10
unknown_string 
###line 11
###line 12
6666
unknown_string 
###line 15
###line 16
5555
EOF

我尝试过使用“sed”命令,

sed -i -e '/known_sting/{p:d;};N;N;N;c; 'known_string'N;'8850'' filename

但没有得到理想的结果。

感谢。

1 个答案:

答案 0 :(得分:2)

awk

更容易
awk '/^[ \t]*known_string/{p=1} p && $0+0==$0{$0="8850"; p=0} 1' file

###line 1..
###line 2..
###line 3..
known_string
###line 5
###line 6
8850
###line 8
###line 9
###line 10
unknown_string
###line 11
###line 12
6666
unknown_string
###line 15
###line 16
5555
EOF
  • /^known_string/{p=1}会在开始时找到known_string时设置标记。
  • $0+0==$0检查是否确保当前行是有效号码。
  • p=0会重置旗帜。