在文件中找到一个string1并检查它的下一行是否为string2,如果没有找到,则在string1行之后附加一些文本。
例如,以下是输入文件
blah
blah
blah
string1
text string2
blah
blah
string1
blah
blah
blah
string1
text string2
blah
blah
blah
string1
text string2
blah
blah
如果在string1的下一行中找不到string2,我需要在10行“ - - - - - - - - - - - - - - - - - - - - ”后附加此文件。输出文件应如下所示。
blah
blah
blah
string1
text string2
blah
blah
string1
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
--------------------------------
blah
blah
blah
string1
text string2
blah
blah
blah
string1
text string2
blah
blah
帮助我在不使用循环的情况下在shell中编写代码。感谢。
答案 0 :(得分:2)
您可以使用Awk。
awk -v s="string1" -v t="string2" '\
$0 ~ s {
print
getline
if($0 !~ t) {
for(i=1;i<=10;i++) {
for(j=1;j<=32;j++)
printf "-"
printf "\n"
}
}
}1' file
为Awk设置两个字符串变量。
-v s="string1" -v t="string2"
如果string1
(变量s
)在线上,则会执行左括号内的所有内容。
$0
只是Awk扩展到整个生产线的方式。
$0 ~ s {
一旦满足条件,我们就会打印该行,然后转到下一行进行getline
处理。
接下来,如果string2
(变量t
)不在该行中,我们会使用-
执行一些循环来打印10行32 printf
个字符。< / p>
print
getline
if($0 !~ t) {
for(i=1;i<=10;i++) {
for(j=1;j<=32;j++)
printf "-"
printf "\n"
}
}
1
只是用于打印的awk简写。我在最外面的条件之外使用它来打印其他所有东西。
}1' file
以下内容会做同样的事情。
}{print}' file
答案 1 :(得分:1)
对于查找模式,我可以告诉你表达式,为了替换行(追加10行),你必须使用sed。 你可以在谷歌上或通过一些实验得到它。
我没有向你提供所有的东西,因为这里没有预料到的。
[db2admin@giam20 ~]$ pcregrep -n -v -M 'string1.*\n.*string2' file1.txt | grep string1
8:string1
上面是正则表达式,它将为您提供该行的行号,该行在下一行中不包含string2。现在提供这个作为sed的输入来完成你的工作。
仅获取行号。使用cut as,
[db2admin@giam20 ~]$ pcregrep -n -v -M 'string1.*\n.*string2' file1.txt | grep string1 |cut -f 1 -d ":"
8
希望这有帮助。