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/'是替换操作符,它取代了source用replacement。在这种情况下,它将简单地删除除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)
这里的想法是将字段分隔符设置为abc或cde。假设这些字符串在每一行中都是唯一的,则第二个字段将介于两者之间。但是,这包括前导和尾随空格,以通过另一个删除它们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)
这与perl和sed的基本思想相同,但使用了 gawk 的gensub()函数。
您想为此使用正则表达式。我对 UNIX 正则表达式没有那么丰富的经验,但是这样的东西应该可以工作
grep -Po '(?<=abc ).*(?= cde)' test.txt > output.txt
编辑:语法错误来自于缺少引号,尽管旧的建议不起作用,但您宁愿使用(?<=xxx)这称为零宽度后视断言,并且无需<您进行前视。-P 激活 perl 风格的正则表达式,-o 只打印匹配项。
尝试过这个并且可以很好地处理包含abc mymatch cde.
| 归档时间: |
|
| 查看次数: |
25247 次 |
| 最近记录: |