“N”命令如何在sed中工作?

前端之家收集整理的这篇文章主要介绍了“N”命令如何在sed中工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
没有序言,
$cat in.txt 
 a
 b
 c
 d
$sed '=;N' in.txt 
1
 a
 b
3
 c
 d

看起来像“N”命令在每隔一行工作.也许这是自然的,因为命令’N’加入下一行并更改当前行号.但,

$sed 'N;$!P;$!D;$d' thegeekstuff.txt

(我看到这个here)
以上示例删除文件的最后两行.这不仅用于偶数编号的文件,还可以使用奇数文件.所以在这个例子中,’N’命令在每行上运行.
有什么区别?
你能告诉我为什么当我运行这样的sed时,我看不到最后一行?

# sed N odd-lined-file.txt

解决方法

摘自信息sed:
`sed' operates by performing the following cycle on each lines of
input: first,`sed' reads one line from the input stream,removes any
trailing newline,and places it in the pattern space.  Then commands
are executed; each command can have an address associated to it:
addresses are a kind of condition code,and a command is only executed
if the condition is verified before the command is to be executed.
...
When the end of the script is reached,unless the `-n' option is in
use,the contents of pattern space are printed out to the output
stream,...
Unless special commands (like 'D') are used,the pattern space is
deleted between two cycles

...

`N'
     Add a newline to the pattern space,then append the next line of
     input to the pattern space.  If there is no more input then `sed'
     exits without processing any more commands.

...

`D'
     Delete text in the pattern space up to the first newline.  If any
     text is left,restart cycle with the resultant pattern space
     (without reading a new line of input),otherwise start a normal
     new cycle.

这应该几乎解决您的查询.但是我仍然会尝试解释你们三种不同的情况:

情况1:

sed从输入中读取一行. [现在模式空间有一行]
> =打印当前行号.
> N将下一行读入模式空间[现在模式空间中有2行]

>如果没有下一行读取,则在这里退出sed. [即:在奇数行的情况下,sed出现在这里 – 因此最后一行被吞没,无需打印.]

> sed打印图案空间并清理它. [图案空间为空.]
>如果EOF在这里到达sed.否则重新启动步骤1的完整循环.[即:如果偶数行,则sed退出.]

总结:在这种情况下,sed读取2行,并一次打印2行.最后一行被吞下,它有奇数行(见步骤3).

案例2:

sed从输入中读取一行. [现在模式空间有一行]
> N将下一行读入模式空间. [现在模式空间有2行]

>如果它失败退出这里.这只有在有1行时才会发生.

>如果它的最后一行($!)从模式空间打印第一行(P). [图案空间的第一行被打印出来.但是模式空间中仍然有2行.]
>如果它的最后一行($!)从模式空间中删除第一行(D)[现在模式空间中只有一行(第二个)],并从步骤2重新启动命令循环.它因为的命令D(见上面的摘录).
>如果最后一行($),则删除(d)完整的模式空间. [即.达到EOF] [开始此步骤之前,模式空间中有2行现在已被d清除 – 在此步骤结束时,模式空间为空.]
sed自动停止在EOF.

总结:在这种情况下:

sed首先读取2行.
>如果有下一行可读取,打印第一行并阅读下一行.
> else从缓存中删除两行.这样它总是删除最后的2行.

案例3:它与CASE:1相同,只需从其中删除步骤2.

猜你在找的Linux相关文章