在shell中获取与sed命令匹配的精确两行之间的行

时间:2019-01-24 08:47:16

标签: linux shell

我在Linux中只有一个文件,其数据类似

Line1A
Line2
Line1
Line3
Line4

我想获得Line1和Line4之间的线,即Line3。 我在shell中使用了以下linux命令。

Sed -n -e "/Line1/,/Line4/p" myFile.txt

这给了我以下输出

Line2
Line1
Line3

上面的输出是因为sed搜索的行包含,而不是精确的行匹配。 有没有办法在提取行匹配之间获取字符串?

4 个答案:

答案 0 :(得分:1)

在sed中,^代表行开始,$代表行结束。

sed -n "/^Line1$/,/^Line4$/p"

您的sed很奇怪,此sed命令应输出模式之间的行,包括模式本身。无论如何,不​​久后在tutorialspoint进行了测试。

答案 1 :(得分:0)

如果我对您的了解很好,那么您正在寻找的是类似sed -n -e '/^Line\(1\|4\)$/p'的东西。

您可以使用'^'表示您希望搜索模式与行首匹配,并希望'$'与行尾匹配。

答案 2 :(得分:0)

尝试awk。

当您使用/../、/../指定范围时,匹配项还将包括边界。 但是对于您而言,则不需要它,因此您无需进行任何操作。

$ cat navnath.txt
Line1A
Line2
Line1
Line3
Line4
$  awk -v p=0 ' /^Line1$/,/^Line4/ { p=1;if(/Line1/ || /Line4/) p=0}p ' navnath.txt
Line3
$

答案 3 :(得分:0)

如果只想在之间,则不包括开头和结尾,一种简单的方法是(GNU sed):

sed -n '/^Line1$/,/^Line4$/{/^Line1$/d;/^Line4$/d;p}'

演示:

$ cat file
Line1A
Line2
Line1
Line3
Line4

$ sed -n '/^Line1$/,/^Line4$/{/^Line1$/d;/^Line4$/d;p}' file
Line3

BSD sed:

sed -n -e '/^Line1$/,/^Line4$/{' -e '/^Line1$/d;/^Line4$/d;p' -e '}'

awk版本:

awk '/^Line1$/{s=1;next}/^Line4$/{s=0}s'
相关问题