linux - 下一行计数器如何在 sed 中更新?

标签 linux ubuntu sed

我无法理解 sed 如何读取下一行。

他是我的理解,不对的地方请指正

/pattern/p 这样逐行读取并在行匹配时打印

N;/pattern/d 所以这会一起读取两行,如果有 pattern 则删除这两行,在下一个循环中 sed 是否开始从第 2 行或第 3 行读取并且该行已被 N 读取?

:a N;/模式/{:b;n;/模式/bb; ba}

现在在上面的例子中是内部循环。 n 多次读取下一行,如果返回 a。现在我的问题是当控制回到 a 那么 N 会读什么

例子

这是示例文件

line 11
line 13
line 13
line 13
line 14
line 15
line 16

最初 N 将包含 . line 11\n line 13 如果 pattern 是 13 然后在内部循环 n 再次读取下一行并返回直到 13 不存在并且然后回到a

现在我的问题是 N 的值是多少?会不会是

第 14 行\n 第 15 行 。或 第 14 行\n 第 13 行

最佳答案

:a N; /pattern/{:b;n;/pattern/bb; ba}

让我们让它更具可读性并添加注释:

# At the start there is one line read from input
# read into pattern space

# define label with the name 'a'
:a

# append next line to pattern space
N

# Match pattern space with 'pattern'
/pattern/{
   # go here if matching successfull

   # define label 'b'
   :b

   # read the next line into pattern space
   # current pattern space is removed
   n

   # match pattern space with /pattern/
   /pattern/{

      # goto label 'b'
      bb
   }

   # goto label 'a'
   ba

}

in next cycle does sed starts reading from Line 2 or Line3 and Line was already read by N?

您无法返回输入。输入有线。 N将输入中的下一行追加到模式空间。读取输入后,您将无法重新读取它。 d删除模式空间并开始循环(即,工作类型为 n; b<label on the beginning>)。

my question is when control go back to a then what will N read

它将分支到:a当模式不再匹配时。

   not
   pattern # jumps into /pattern/{ .. }
   pattern # jumps into inside /pattern/bb
   pattern
   pattern
   not # get's back to :a

my questions is what will be the value of N?

N没有值(value)它是一个命令,将输入的下一行追加到模式空间。

N之后的模式空间内容命令将包含两行。在您最初提供的示例中,它将有 line 11\nline13然后line14\nline15 .用一个简单的脚本就很容易看出来:

sed -n ':a N; p; /13/{:b;n;/13/bb; ba}' <<EOF
line 11
line 13
line 13
line 13
line 14
line 15
line 16
EOF

所有命令的解释都可以在man sed中找到. This是对 sed 的一个很好的介绍。

关于linux - 下一行计数器如何在 sed 中更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55822978/

相关文章:

java - maven-compiler-plugin 在 linux 上坏了?

c - 套接字编程-更改套接字IP

CakePHP 安装失败(可能是 Apache2 问题)

linux - 如何删除名称为 '--' 的目录

regex - Linux 从命令行查找和替换

bash - 如何并排输出sed?

linux - 为什么 userA$ sudo su userB -c 'printenv' 不打印 userB 的环境详细信息

Java挂了几秒,但是在gc log中没有发现gc pause

mysql - 如何在ubuntu Linux中运行 Crystal 报表

regex - Unix : Find and replace consecutive commas to consecutive pipelines