如何提取两个不唯一的图案之间的线条?
例子:-
data of type samplex
name a
property b
data of type samplex
name c
property d
data of type samplex
name e
property f
data of type sampley
name g
property h
我想在模式“samplex 类型的数据”之间搜索并获取它们之间出现的所有行。
First occurrence:-
name a
property b
Second occurrence:-
name c
property d
Third occurrence:-
name e
property f
为了单独获得第一次出现并且当两个模式不同时,
sed '/pattern1/,/pattern2/p;/pattern2/q' <file> will work.
我如何才能调整这个命令来满足我的需求?
答案1
sed 's:data of type samplex:\n:g' File_name -i
此代码将用换行符替换所述字符串,以便您获得所需的信息。使用-i
选项仅保存原始文件中的更改。
答案2
这对你有用吗?
grep "data of type samplex" -A 2 <file>
答案3
基于我对你想要的内容可能错误的解释...显然,如果你可以匹配少于整个短语,你可以缩短它。
sed -n '/data\ of\ type\ samplex/,/data\ of\ type\ sampley/{s/data\ of\ type\ sample[xy]//; p}' file
-n
[xy]
安静,在我们想要输出匹配 x 或 y之前不要打印任何内容,
s/data\ of\ type\ sample[xy]//
删除匹配的模式,留下空行
p
打印所有之后剩下的内容
输出:
name a
property b
name c
property d
name e
property f
我还没有弄清楚如何在您需要的情况下添加递增的“第 N 次出现 :-”
答案4
假设:
- 输入文件具有各个部分,后跟诸如,等
data of type
关键字划分samplex
sampley
- 需要提取:属于特定部分的所有文本
输入文件已稍微修改以反映极端情况
$ cat ip.txt
data of type samplex
name a
property b
data of type samplez
name 1
property 2
data of type samplex
name e
property f
data of type sampley
name g
property h
data of type samplex
name c
property d
在下面的解决方案中,如果部分匹配,则$match
设置为,否则当输入行为 时。然后打印输入行,直到下一部分开始。这样,文件末尾的部分也会得到处理。1
0
data of type
$ perl -ne 'if(/data of type /){$match=/samplex$/} elsif($match){print}' ip.txt
name a
property b
name e
property f
name c
property d
$ perl -ne 'if(/data of type /){$match=/samplez$/} elsif($match){print}' ip.txt
name 1
property 2
$ perl -ne 'if(/data of type /){$match=/sampley$/} elsif($match){print}' ip.txt
name g
property h