一个linux shell脚本,用于查找字符串并在字符串前添加几行

时间:2013-01-09 12:42:15

标签: linux string shell sed

我是新手,只是想知道是否有人可以提供帮助:)。

我有一个这样的文件:

start1  
12.3  
13.2  
15.3  
end1

如何找到字符串end1并在字符串前添加几行,所以它看起来像:

start1  
12.3  
13.2  
15.3  
NaN  
NaN  
end1

但添加的行数必须取决于具体的数字,例如5.如果在start1和end1之间只有3个条目,则添加的行数为2.

7 个答案:

答案 0 :(得分:2)

您可以使用awk(1)轻松完成此操作:

awk '/start1/ {start=NR} /end1/ && start {for (i=NR-start;i<=5;++i) {print "NaN"}} 1'

这将记录字符串start1所在的行,当它看到字符串end1时,它将输出最多5行NaN,具体取决于相隔多远{{1} }和start1是。将5改为你需要的任何东西。

答案 1 :(得分:1)

目前还不清楚你提到的这个数字是否总是你从文件内容或你可能编程的东西中找到的东西但是试试这个:

awk '
/start/ { c=0 }
/end/   { for (i=1; i<c; i++) print "NaN" }
{ print; ++c }
' file

告诉我们任何问题。

编辑:如果存在少于5行,则添加c行:

awk '
/start/ { c=0 }
/end/ && c<5  { for (i=1; i<c; i++) print "NaN" }
{ print; ++c }
' file

或填充最多5行:

awk '
/start/ { c=0 }
/end/   { for (i=c; i<=5; i++) print "NaN" }
{ print; ++c }
' file

答案 2 :(得分:1)

awk -vt=5 '/start1/{print;next;}/end1/{for(x=1;x<=t-i;x++)print "NaN";}++i' file

你只需要替换上面的单行中的5来获得不同数量的“NaN”:)

编辑:开始可能不在第1行。

awk -vt=5 '/start1/{i=0;print;next;}/end1/{for(x=1;x<=t-i;x++)print "NaN";}++i' file

测试

kent$  cat t
Empty lines followed




foo
foo1
start1  
12.3  
13.2  
15.3  
end1
bar
bar2

kent$  awk -vt=5 '/start1/{i=0;print;next;}/end1/{for(x=1;x<=t-i;x++)print "NaN";}++i' t
Empty lines followed




foo
foo1
start1  
12.3  
13.2  
15.3  
NaN
NaN
end1
bar
bar2

答案 3 :(得分:0)

您可以使用sed来执行此类操作:

`sed /end1/lineToAdd0\nlineToAdd1\netc\nend1/g < file`

我不确定\n,我不记得是sed是否以特殊的方式解释它。

答案 4 :(得分:0)

我承认我不知道用Sed做你想做的事情的简单方法。有人可能会发布一个Awk答案,这很好,但如果不介意启动Perl解释器的运行时成本,这也是有效的:

perl -we 'print until eof() or ($_ = <>) =~ /^start1\s*$/; exit if eof(); print; my $i = 5; --$i, print until eof() or ($_ = <>) =~ /^end1\s*$/; --$i, print "NaN\n" until $i <= 0; print; print <>;'

答案 5 :(得分:0)

这更适合awk只需将c设置为您需要的数字:

$ awk -vc=5 '/start/{n=0}/end/{for(i=0;i++<c+1-n;)print"NaN"}++n' file
start1  
12.3  
13.2  
15.3  
NaN
NaN
end1

$ awk -vc=8 '/start/{n=0}/end/{for(i=0;i++<c+1-n;)print"NaN"}++n' file
start1  
12.3  
13.2  
15.3  
NaN
NaN
NaN
NaN
NaN
end1

答案 6 :(得分:0)

这可能适合你(GNU sed):

sed -r '/^start/!b;n;:a;/\nend/bb;$!{N;ba};:b;/(\n[^\n]*){5}/!s/$/\nNaN/;tb;s/(\nend[^\n]*)(.*)/\2\1/' file