如何从文件中提取相同模式之间的行

如何从文件中提取相同模式之间的行

如何提取两个不唯一的图案之间的线条?

例子:-

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关键字划分samplexsampley
  • 需要提取:属于特定部分的所有文本

输入文件已稍微修改以反映极端情况

$ 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设置为,否则当输入行为 时。然后打印输入行,直到下一部分开始。这样,文件末尾的部分也会得到处理。10data 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

相关内容