sed命令的排序因未知原因而中断

时间:2015-09-29 14:15:54

标签: linux bash sed

输入

FILE.TXT

Start
1
2
3
4
Start
5
6
7
8

问题

我正在利用sed来解决从Start之间获取数据的不同方法。

我制作的一个剧本是

sed ':2;h;$!N;$b1;/\n.*Start[^\n]*$/{:1;$!x;/5/p;x;s/.*\n//};$!b2;d'

脚本说明

:2 #A label for the break point

;h #Hold all the lines currently in the pattern buffer, i use this before getting the next line so that it doesn't have the next start.

 ;$!N # Gets the next line for every line except the last

 ;$b1 # Breaks to label 1 on the last line. This is to bypass having to see start to enter the block


 ;/\n.*Start[^\n]*$/ # If start is on the last line of pattern buffer then execute the next block

  { #Start of block

  :1 #Label to jump to if end of file

  ;$!x # If not the last line switch in the hold buffer we got which doesn't include the next `Start`.

  ;/5/p # Print if this Start section contains `5`

  ;x #Switch back hold buffer and pattern to get `Start` back

  ;s/.*\n// #Delete everything up to last line of pattern buffer(leaving just `Start`.

  } # End block

  ;$!b2 # If not end of file go back to label at the start

  ;d #Deletes anything left in pattern buffer when we reach the end of the file

输出

Start
5
6
7
8

哪个是正确的

但是将$!N;$b1;的顺序更改为$b1;$!N会使脚本输出任何内容。

sed ':2;h;$b1;$!N;/\n.*Start[^\n]*$/{:1;$!x;/5/p;x;s/.*\n//};$!b2;d'

我不知道我是否遗漏了一些明显的东西,或者我并不真正理解$的含义,但在我看来,这似乎没有任何区别。命令只在最后一行($)上执行,而另一行在所有其他行上执行,所以顺序不应该重要吗?

欢迎任何解释,如果需要更多信息,请告诉我。

此外,我不想要一个更好的方法,我只想解释它为什么会发生。

更多信息

  • GNU sed版本4.1.5

1 个答案:

答案 0 :(得分:1)

var query = new SQLiteCommand("select name,latitude,longitude,country_code,feature_code from geoloc order by ((latitude - @lat) * (latitude - @lat) + (longitude - @lng) * (longitude - @lng)) LIMIT 1, cn); 在最后一次添加之前的行,然后是分支(因为它现在是最后一行),whe $!N;$b1不分支,追加,不进入块。以下是$b1;$!N未采用,后跟$!b2删除模式。 (并且结束脚本,因为没有更多输入) - Hasturkun