打印两个图案之间(和排除)的线条

打印两个图案之间(和排除)的线条

我将使用 cURL 提交表单,其中一些内容来自其他文件,使用选择sed

如果param1使用其他文件的行匹配模式sed,则以下命令将正常工作:

curl -d param1="$(sed -n '/matchpattern/p' file.txt)" -d param2=value2 http://example.com/submit

现在,开始解决问题。我只想显示两个匹配模式之间的文本,不包括匹配模式本身。

可以说file.txt包含:

Bla bla bla
firstmatch
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.
secondmatch
The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.

目前,许多“beetween 2 匹配模式”sed命令不会删除firstmatchsecondmatch

我希望结果变成:

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.

答案1

这是您可以做到的一种方法:

sed '1,/firstmatch/d;/secondmatch/,$d' 

解释:从第一行到匹配的行第一场比赛, 删除。从线路匹配来看第二场比赛到最后一行,删除。

答案2

如果出现在第一行1上,另一种sed解决方案将失败。 firstmatch

保持简单,使用单个范围和一个空的2正则表达式:
要么打印该范围内的所有内容,不包括范围结束(自动打印已禁用)3

sed -n '/firstmatch/,/secondmatch/{//!p;}' infile

或者,更短地说,删除不在该范围内的所有内容,并删除范围结束:

sed '/firstmatch/,/secondmatch/!d;//d' infile


1:原因是 如果第二个地址是正则表达式,则检查结束匹配将从与第一个地址匹配的行后面的行开始
因此,/firstmatch/永远不会评估输入的第一行,sed只会将其删除,因为它与中的行号匹配1,/RE/,并移至第二行,检查该行是否匹配/firstpattern/

2:当一个正则表达式为空(即//sed的行为就像最后一个正则表达式指定了最后应用的命令中使用的内容(作为地址或作为替代命令的一部分)。

3:;}语法适用于现代sed实现;对于较旧的,使用换行符而不是分号或单独的表达式,例如sed -n -e '/firstmatch/,/secondmatch/{//!p' -e '}' infile

答案3

在 awk 中:

awk '
  $1 == "secondmatch" {print_me = 0}
  print_me {print}
  $1 == "firstmatch {print_me = 1}
'

相关内容