我有一个像这样的文件:
DogBulldog
小猎犬
CatPersian
ApeGorilla
DogPitbull
实验
谢泼德
哈士奇
我希望能够搜索每一行包含狗和选择一切,直到下一个空行,并将其放入一个新的文件。
我想要一个输出文件,如:
DogBulldog
小猎犬
DogPitbull
实验
谢泼德
哈士奇
我知道我可以使用grep来找到单词狗,但是我如何使用它,或者用什么来使用它,这样它就可以抓住它之后的所有东西,直到下一个空行,并将它移动到另一个文件中。
为了做到这一点,我用Perl编写了一个脚本,因为我希望添加一些其他的东西,这样可以使Perl更容易实现。我本来打算用system(grep....)来找到这个词,但后来我不知道该怎么做。
我还将注意到,我希望能够递归地做到这一点。我有许多与我所显示的文件类似的文件,我想从所有这些文件中提取Dog块。因此,这将是从目录递归的东西。
发布于 2019-09-26 14:29:40
perl -ne 'print if /^Dog/../^$/' file
perl中的..和...运算符可以连接两个条件。从第一个计算为真到第二个条件计算为真的时间起,联接条件将计算为真。因此,您希望从$_ =~ m/^Dog/为真到$_ =~ m/^\s+$/为真这段时间开始执行$_ =~ m/^\s+$/。以上就是这一点的简写。
在这里,..和...之间的区别并不重要,因为在这种情况下,条件词不能在同一行中都是真的。
发布于 2019-09-26 05:32:47
如果您可以使用awk,那么就可以这样做。通过将记录选择器设置为空,awk在块模式下工作。测试块是否以dog开头,如果是,请执行默认操作,打印块。
awk '/^Dog/' ORS="\n\n" RS="" file
Dog
Bulldog
Terrier
Dog
Pitbull
Lab
Shepard
Huskyhttps://stackoverflow.com/questions/58107808
复制相似问题