下一行计数器如何在 sed 中更新? [英] How does Next line counter get updated in sed?
问题描述
我无法理解 sed 如何读取下一行.
他是我的理解,请纠正我的错误
/pattern/p
所以这会逐行读取并打印是否匹配行
N;/pattern/d
所以这会一起读取两行,如果模式存在,则删除两行,在下一个循环中,sed 会从第 2 行或第 3 行开始读取,并且行已被 N 读取?
:a N;/pattern/{:b;n;/pattern/bb;ba}
现在在上面的例子中是内循环.n 多次阅读下一行,如果然后返回 a.现在我的问题是当控制回到 a 那么 N 会读取什么
示例
这是示例文件
第 11 行第 13 行第 13 行第 13 行第 14 行第 15 行第 16 行
最初 N 将包含 .line 11 \n line 13
如果模式是 13
然后在内部循环 n
再次读取下一行并返回直到 13 不存在并且然后回到a
现在我的问题是 N
的值是多少?会不会
line 14 \n line line 15
.或 line 14 \n line 13
使用 GNU 调试器 --debug
可以观察到所有这些行为.
▶ data="line 11第 13 行第 13 行第 13 行第 14 行第 15 行线 16"
输出:
▶ gsed ':a N;/13/{:b;n;/13/bb;巴}' <<<$数据11号线第 13 行第 13 行第 13 行第 14 行第 15 行第 16 行
调试器中的输出视图:
▶ gsed --debug ':a N;/13/{:b;n;/13/bb;巴}' <<<$数据
SED 程序::一种N/13/{:bn/13/b b乙}输入:'标准输入'第 1 行模式:第 11 行命令: :a命令:N模式:第 11 行\n第 13 行命令:/13/{命令: :b命令:n11号线第 13 行模式:第 13 行命令:/13/b b命令: :b命令:n第 13 行模式:第 13 行命令:/13/b b命令: :b命令:n第 13 行模式:第 14 行命令:/13/b b命令: b a命令: :a命令:N模式:第 14 行\n第 15 行命令:/13/{命令: }周期结束:第 14 行第 15 行输入:'标准输入'第 7 行模式:第 16 行命令: :a命令:N周期结束:第 16 行
<块引用>
现在我的问题是当控制回到 a 那么 N 会读取什么
如您所见:
PATTERN:第 14 行命令:/13/b b命令: b a命令: :a命令:N模式:第 14 行\n第 15 行
所以紧跟在ba
之后的命令是:a
然后是N
,而N
的作用是读取输入流的下一行并将其附加到模式空间.
I am not able to understand how does sed reads next line.
He is my understanding and please correct me where i am wrong
/pattern/p
so this reads line by line and prints if line is matched
N;/pattern/d
so this reads two lines together and if pattern is there then deletes both and in next cycle does sed starts reading from Line 2 or Line3 and Line was already read by N?
:a N; /pattern/{:b;n;/pattern/bb; ba}
Now in above case the inner loop. n read next line multiple times and if then go back to a. Now my question is when control go back to a then what will N read
example
This is sample file
line 11
line 13
line 13
line 13
line 14
line 15
line 16
Initially N will contain . line 11 \n line 13
if pattern is 13
then in the inner loop n
again reads next line and go back untill 13 is not there and then go back to a
Now my questions is what will be the value of N
? will it be
line 14 \n line line 15
. or line 14 \n line 13
All of this behaviour can be observed using the GNU debugger, --debug
.
▶ data="line 11
line 13
line 13
line 13
line 14
line 15
line 16"
Output:
▶ gsed ':a N; /13/{:b;n;/13/bb; ba}' <<< $data
line 11
line 13
line 13
line 13
line 14
line 15
line 16
Output view in debugger:
▶ gsed --debug ':a N; /13/{:b; n; /13/bb; ba}' <<< $data
SED PROGRAM:
:a
N
/13/ {
:b
n
/13/ b b
b a
}
INPUT: 'STDIN' line 1
PATTERN: line 11
COMMAND: :a
COMMAND: N
PATTERN: line 11\nline 13
COMMAND: /13/ {
COMMAND: :b
COMMAND: n
line 11
line 13
PATTERN: line 13
COMMAND: /13/ b b
COMMAND: :b
COMMAND: n
line 13
PATTERN: line 13
COMMAND: /13/ b b
COMMAND: :b
COMMAND: n
line 13
PATTERN: line 14
COMMAND: /13/ b b
COMMAND: b a
COMMAND: :a
COMMAND: N
PATTERN: line 14\nline 15
COMMAND: /13/ {
COMMAND: }
END-OF-CYCLE:
line 14
line 15
INPUT: 'STDIN' line 7
PATTERN: line 16
COMMAND: :a
COMMAND: N
END-OF-CYCLE:
line 16
Now my question is when control go back to a then what will N read
As you can see:
PATTERN: line 14
COMMAND: /13/ b b
COMMAND: b a
COMMAND: :a
COMMAND: N
PATTERN: line 14\nline 15
So the command immediately afterba
is :a
and then N
, and N
has the effect of reading the next line of the input stream and appending it to the pattern space.
这篇关于下一行计数器如何在 sed 中更新?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!