2016-09-12 56 views
1

我的文件是這樣的使用正則表達式在bash一個單詞 -試圖在一列uusing慶典

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

您可以使用

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

這應該打印你想要的線條。

0

我想你需要類似的東西:

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

它會返回包含xyz當它不前或後一個字母都行。

0

我認爲這是你需要的。

awk '/_xyz-/' file 
sun_xyz-hi 
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不區分大小寫的匹配
+0

只有這個答案似乎涵蓋所有測試用例。 +1 –

0

與該輸入你需要的是:

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

如果這不是你需要什麼然後編輯你的問題,以包含更真實有代表性的樣本輸入/輸出。

0

任何字符串_xyz沿-是允許的,即使有附加的數字,它是好的 - - xyz不應該是另一封信,即一個子。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