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

Blu*_*lue 5 linux terminal grep regex

如何在 Ubuntu 终端中搜索此模式的文本文件并将输出保存为文本文件?

我正在寻找一长串数据中字符串“abc”和字符串“cde”之间的所有内容。

例如:

blah blah abc fkdljgn cde blah
blah blah blah blah blah abc skdjfn cde blah
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我会寻找这样的输出:

fkdljgn
skdjfn
Run Code Online (Sandbox Code Playgroud)

重要的是我还可以将数据输出保存为文本文件。

我可以使用 grep 或 agrep 吗?如果可以,格式是什么?

ter*_*don 11

要获得您显示的输出,您可以运行

grep -Po 'abc \K.*(?= cde)'  file.txt > outfile.txt
Run Code Online (Sandbox Code Playgroud)

P激活具有支持Perl兼容的正则表达式lookarounds\K它的意思是“丢弃任何匹配了这一点。” 仅打印行的匹配部分的-o原因grep,结合正向前瞻 ( ?=cde) 和\K,它将仅打印abc和之间的字符cde。在> outfile.txt将结果保存到文件中outfile.txt

其他一些方法:

  • sed

    sed -r 's/.*abc (.+) cde.*/\1/' file.txt > outfile.txt
    
    Run Code Online (Sandbox Code Playgroud)

    在这里,括号捕获模式,然后您可以将其称为\1. 该's/source/replacement/'是替换操作符,它取代了sourcereplacement。在这种情况下,它将简单地删除除abc和之间的所有内容之外的所有内容cde

  • perl

    perl -pe 's/.*abc (.+) cde.*/$1/' file.txt > outfile.txt
    
    Run Code Online (Sandbox Code Playgroud)

    真的和上面一样,-p意思是“逐行读取输入文件,应用给定的脚本-e并打印。

  • awk

     awk -F'abc|cde' '{print $2}' file.txt > outfile.txt
    
    Run Code Online (Sandbox Code Playgroud)

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

    awk -F'abc|cde' '{print $2}' file | awk '{print $1}'
    
    Run Code Online (Sandbox Code Playgroud)
  • GNU awk( gawk) 上面的方法也很完美,gawk如果你想做一些更复杂的事情并且需要能够捕获模式,我会把它包括在内。

    gawk '{print gensub(/.*abc (.*) cde.*/,"\\1", "g",$0);}' file.txt > outfile.txt
    
    Run Code Online (Sandbox Code Playgroud)

    这与perlsed的基本思想相同,但使用了 gawk 的gensub()函数。


tim*_*sku 3

您想为此使用正则表达式。我对 UNIX 正则表达式没有那么丰富的经验,但是这样的东西应该可以工作

grep -Po '(?<=abc ).*(?= cde)' test.txt > output.txt

编辑:语法错误来自于缺少引号,尽管旧的建议不起作用,但您宁愿使用(?<=xxx)这称为零宽度后视断言,并且无需<您进行前视。-P 激活 perl 风格的正则表达式,-o 只打印匹配项。

尝试过这个并且可以很好地处理包含abc mymatch cde.