我的文件是这样的 -
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
但它似乎不起作用。
答案 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])
负向前瞻 - 模式后面没有字母对于不区分大小写的版本,例如Xyz
,xYz
等也是有效匹配
$ 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