如何在 Ubuntu 终端中搜索文本文件中两个标记之间的字符串并保存输出?

如何在 Ubuntu 终端中搜索文本文件中两个标记之间的字符串并保存输出?

如何在 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

激活PPerl 兼容正则表达式,支持环视\K表示“丢弃到此点为止匹配的所有内容”。-o导致grep仅打印行的匹配部分,因此,结合正向前瞻 ( ?=cde) 和,它将仅打印和\K之间的字符。将结果保存在文件中。abccde> outfile.txtoutfile.txt

其他一些方法:

  • sed

    sed -r 's/.*abc (.+) cde.*/\1/' file.txt > outfile.txt
    

    这里,括号捕获了模式,然后您可以将其引用为\1's/source/replacement/'是替换运算符,它用 替换source。在这种情况下,它将删除和replacement之间的所有内容。abccde

  • perl

    perl -pe 's/.*abc (.+) cde.*/$1/' file.txt > outfile.txt
    

    实际上与上面相同,-p意思是“逐行读取输入文件,应用给定的脚本-e并打印。

  • awk

     awk -F'abc|cde' '{print $2}' file.txt > outfile.txt
    

    这里的想法是将字段分隔符设置为abccde。假设这些字符串在每一行中都是唯一的,则第二个字段将是两者之间的字段。但是,这包括前导和尾随空格,要删除它们,请通过另一个awk

    awk -F'abc|cde' '{print $2}' file | awk '{print $1}'
    
  • GNU awkgawk)。上面的方法在 中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

相关内容