在(和排除)两个模式之间打印行


13

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

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

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

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

可以说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.

目前,许多“在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.

Answers:


15

这是您可以执行的一种方法:

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

说明:从第一行到匹配firstmatch的行,删除。从线路匹配secondmatch到最后一行,删除。



5

sed如果firstmatch在第一行1上发生,其他解决方案将失败。

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

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

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

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


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

2:当一个REGEX为空时(即//)的sed行为就像指定了所应用的最后一个命令中使用的最后一个REGEX(作为地址或作为替代命令的一部分)。

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


您可以在中解释//正在做什么{…}吗?
G-Man说'Restore Monica''Mar

谢谢,但是你掉进了我的陷阱。我知道这//意味着最后使用的正则表达式;从我阅读的所有内容来看,应该是/secondmatch/。我已经通过测试验证了您的命令是否有效,因此得出结论,该命令可以正常工作/firstmatch|secondmatch/(已确认),但是找不到任何文档(甚至您链接到的POSIX文档GNU都没有) sed manual)描述了此行为。…(续)
G-Man说'Reinstate Monica''Mar

(续)…有趣的实验:(I)在sed:(1)如果我这样做/first/,4,则//表现为/first/。(2)如果我这样做了2,/second/,那么//会得到“没有先前的正则表达式”错误。(我发现这是公然的失败,无法遵循指定的行为。)(3)添加--posix不会改变以上任何一种情况。(II)在其他程序中:(4)在vi,之后/first/,/second/,的//行为类似/second/(并且其他形式也是文档规则的合理实现)。…(续)
G-Man说'Reinstate Monica''Mar

(续)...(5)  awk似乎没有“最后使用的RE”的概念; //指任何字符之前或之后的非字符。(我邀请您尝试echo -- | awk '{ gsub(//, "cha"); print }'。)
G-Man说'Reinstate Monica'18

因此,您将“上一条命令中使用的最后一个REGEX”读为“上一条命令中使用的最后一个REGEX”,因此(正确地)猜到了它的意思/first|second/。幸运的你。我提到了其他程序,以证明这不是系统范围内的正则表达式约定。凡是将其添加到的sed人都不会费心将其添加到中vim,而在该位置,它本来就有意义。:-)⁠
G-人说'恢复莫妮卡'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.