gpt4 book ai didi

sed - s中的“N”命令如何工作?

转载 作者:行者123 更新时间:2023-12-03 20:11:47 24 4
gpt4 key购买 nike

没有序言

$ cat in.txt
一个
b
C
d
$ sed'=; N'in.txt
1个
一个
b
3
C
d


看起来“ N”命令在每隔一行上都有效。也许这很自然,因为命令“ N”会加入下一行并更改当前行号。但,

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


(我看到了这个here
上面的示例删除文件的最后两行。这不仅适用于偶数行编号的文件,而且适用于奇数行编号的文件。因此,在此示例中,“ N”命令在每一行上运行。
有什么区别?
而且您能告诉我为什么在运行sed时为什么看不到最后一行吗?

#sed N奇数行文件.txt

最佳答案

摘录自info 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从输入中读取一行。 [现在模式空间中有1行。]
=打印当前行号。
N将下一行读入模式空间。[现在模式空间中有2行。]

如果没有下一行要读取,则sed在此处退出。 [即:如果是奇数行,则sed在此处退出-因此,最后一行被吞咽而没有打印。

sed打印图案空间并清理它。 [模式空间为空。]
如果达到 EOF,则 sed在此处退出。否则,从步骤1重新开始整个循环。[即:如果是偶数行,则sed在此处退出。]


摘要:在这种情况下,sed读取2行并一次打印2行。吞下最后一行,其中有奇数行(请参见步骤3)。

情况2:


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

如果失败,请在此处退出。仅当有1行时才会发生这种情况。

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


摘要:在这种情况下:


sed首先读取2行。
如果有下一行可供读取,请打印第一行并读取下一行。
否则从缓存中删除这两行。这样,它将始终删除最后两行。


情况3:
与情况:1相同,只需从其中删除步骤2。

关于sed - s中的“N”命令如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6255796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com