下一行计数器如何在 sed 中更新? [英] How does Next line counter get updated in sed?

查看:45
本文介绍了下一行计数器如何在 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆