我无法理解 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
关于linux - 下一行计数器如何在 sed 中更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55822978/