尝试在bash中使用正则表达式来使用bash中的特定单词

时间:2016-09-12 01:06:38

标签: regex bash awk

我的文件是这样的 -

dog_xyz123
cat_xyz_lm
sun_xyz-hi
moon_xyzabc

现在我想只保留完全xyz的行。这意味着任何包含_-以及xyz的字符串都是允许的,即使附加了数字,也没关系。只是xyz不应该是另一个字母的子字符串。这意味着xyzabc不会被允许,也不会abcxyz

我尝试的内容如下:

 awk 'match($1,/[-_]?xyz[-_][A-Za-z_0-9-]+/) {print $1}' filename

但它似乎不起作用。

6 个答案:

答案 0 :(得分:1)

如果你有grep pcre

$ cat ip.txt 
dog_xyz123
xyz4
ABCxyz
abc_Xyz-123
cat_xyz_lm
sun_xyz-hi
xyz
moon_xyzabc
2xyz

$ grep -P '(?<![A-Za-z])xyz(?![A-Za-z])' ip.txt 
dog_xyz123
xyz4
cat_xyz_lm
sun_xyz-hi
xyz
2xyz
  • xyz模式匹配
  • (?<![A-Za-z])负面的背后 - 模式不能在它之前有字母
  • (?![A-Za-z])负向前瞻 - 模式后面没有字母

对于不区分大小写的版本,例如XyzxYz等也是有效匹配

$ grep -iP '(?<![a-z])xyz(?![a-z])' ip.txt 
dog_xyz123
xyz4
abc_Xyz-123
cat_xyz_lm
sun_xyz-hi
xyz
2xyz
  • -i不区分大小写的匹配

答案 1 :(得分:0)

您可以使用

grep -e "[_-]\d*xyz/d*[_-]" <infile>

哪个应该打印你想要的行。

答案 2 :(得分:0)

我认为你需要这样的东西:

grep -E '^(.*[^A-Za-z])?xyz([^A-Za-z].*)?$'

如果字母前面或后面没有字母,则会返回包含xyz的所有行。

答案 3 :(得分:0)

我认为这就是你所需要的。

awk '/_xyz-/' file
sun_xyz-hi

答案 4 :(得分:0)

有了这个输入,你只需要:

awk -F'[-_]' '$2=="xyz"' file

如果这不是您所需要的,那么请编辑您的问题以包含更具真实代表性的样本输入/输出。

答案 5 :(得分:0)

允许使用-xyz以及xyz的任何字符串,即使附加了数字,也可以 - - { {1}}不应该是另一个字母的子字符串,即。 xyz被除了字母之外的任何内容所包围,包括记录的开头(^)和结尾($):

$ grep "\(^\|[^a-zA-Z]\)xyz\([^a-zA-Z]\|$\)" foo
dog_xyz123
cat_xyz_lm
sun_xyz-hi

修改您的awk解决方案以支持此功能:

awk 'match($0,/(^|[^a-zA-Z])xyz([^a-zA-Z]|$)/ {print $0}' foo
dog_xyz123
cat_xyz_lm
sun_xyz-hi