仅模式匹配字符串

时间:2019-02-12 04:34:36

标签: awk sed grep

我有一个包含单词

的文件
abciuf.com abdbhj.co.in abcshjkl.org.in.2 abciuf zasdg cbhjk asjk 

,包括其他内容。以abci, abdb, abcs, abai开头的单词是我的要求。因此,我只希望打印以abci, abdb, abcs, abai开头的单词,例如-abciuf.com abdbhj.co.in abcshjkl.org.in.2 abciuf Azerbaijan

我已经通过grep命令尝试过,但是对我没有帮助

cat /etc/xyz.txt|egrep -o "abdb*|abci*|abcs*|abai*"
cat /etc/xyz.txt|egrep -Eow "abdb*|abci*|abcs*|abai*"

3 个答案:

答案 0 :(得分:1)

grep -Eo `\<(abdb|abci|abcs|abai)\S*' </etc/xyz.txt
  • \<(或\b)匹配“单词”(或“单词”边界)的开头
  • (A|B)匹配A或B
  • \S*匹配零个或多个非空格字符(直到非非空格字符)

  • 尝试使用grep的-w选项是一个好主意,但是它对“单词”的定义太严格了(如果遇到.,匹配就会停止)

  • *
  • shell含义与grep的含义不同
  • 您可以使正则表达式更短,但更难以阅读

答案 1 :(得分:1)

您也可以尝试Perl

 perl -ne ' while(/(\b(abdb|abci|abcs|abai)\S+)/g) { print "$1 \n" } '

使用您的输入

$ cat sin15.txt
abciuf.com abdbhj.co.in abcshjkl.org.in.2 abciuf zasdg cbhjk asjk

$ perl -ne ' while(/(\b(abdb|abci|abcs|abai)\S+)/g) { print "$1 \n" } ' sin15.txt
abciuf.com
abdbhj.co.in
abcshjkl.org.in.2
abciuf

$

答案 2 :(得分:0)

使用GNU awk进行多字符RS和RT:

$ awk -v RS='\\<(abdb|abci|abcs|abai)\\S*' 'RT{print RT}' file
abciuf.com
abdbhj.co.in
abcshjkl.org.in.2
abciuf