![如何在 Ubuntu 终端中搜索文本文件中两个标记之间的字符串并保存输出?](https://linux22.com/image/1410916/%E5%A6%82%E4%BD%95%E5%9C%A8%20Ubuntu%20%E7%BB%88%E7%AB%AF%E4%B8%AD%E6%90%9C%E7%B4%A2%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E4%B8%A4%E4%B8%AA%E6%A0%87%E8%AE%B0%E4%B9%8B%E9%97%B4%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B9%B6%E4%BF%9D%E5%AD%98%E8%BE%93%E5%87%BA%EF%BC%9F.png)
如何在 Ubuntu 终端中搜索文本文件中的此模式并将输出保存为文本文件?
我在一长串数据中寻找字符串“abc”和字符串“cde”之间的所有内容。
例如:
blah blah abc fkdljgn cde blah
blah blah blah blah blah abc skdjfn cde blah
在上面的例子中,我将寻找如下输出:
fkdljgn
skdjfn
重要的是我还可以将数据输出保存为文本文件。
我可以使用 grep 或 agrep 吗?如果可以,格式是什么?
答案1
要获得显示的输出,您可以运行
grep -Po 'abc \K.*(?= cde)' file.txt > outfile.txt
激活P
Perl 兼容正则表达式,支持环视和\K
表示“丢弃到此点为止匹配的所有内容”。-o
导致grep
仅打印行的匹配部分,因此,结合正向前瞻 ( ?=cde
) 和,它将仅打印和\K
之间的字符。将结果保存在文件中。abc
cde
> outfile.txt
outfile.txt
其他一些方法:
sed
sed -r 's/.*abc (.+) cde.*/\1/' file.txt > outfile.txt
这里,括号捕获了模式,然后您可以将其引用为
\1
。's/source/replacement/'
是替换运算符,它用 替换source
。在这种情况下,它将删除和replacement
之间的所有内容。abc
cde
perl
perl -pe 's/.*abc (.+) cde.*/$1/' file.txt > outfile.txt
实际上与上面相同,
-p
意思是“逐行读取输入文件,应用给定的脚本-e
并打印。awk
awk -F'abc|cde' '{print $2}' file.txt > outfile.txt
这里的想法是将字段分隔符设置为
abc
或cde
。假设这些字符串在每一行中都是唯一的,则第二个字段将是两者之间的字段。但是,这包括前导和尾随空格,要删除它们,请通过另一个awk
:awk -F'abc|cde' '{print $2}' file | awk '{print $1}'
GNU
awk
(gawk
)。上面的方法在 中gawk
也能完美运行,我将其包括在内以防您想做一些更复杂的事情并且需要能够捕捉模式。gawk '{print gensub(/.*abc (.*) cde.*/,"\\1", "g",$0);}' file.txt > outfile.txt
perl
这与和的基本思想相同,sed
但使用 gawk 的gensub()功能。
答案2
你想使用正则表达式来实现这一点。我对 UNIX 正则表达式不是很熟悉,但类似这样的方法应该可以
grep -Po '(?<=abc ).*(?= cde)' test.txt > output.txt
编辑:语法错误是由于缺少引号而产生的,虽然旧的建议不起作用,但您宁愿使用(?<=xxx)
这个称为零宽度后视断言的断言,而不需要<
您进行前视。-P 激活 perl 样式正则表达式,-o 仅打印匹配项。
尝试了此操作并可以对包含的文本文件进行正常工作abc mymatch cde
。