我想在一行中找到一个包含子词的单词。如果找到,我想看到它(第一个实例就足够了)。 groups ${whoami} | grep -i access_ftp
的问题在于我看到了所有内容,而不仅仅是com.apple.access_ftp
。那么,我可以用什么而不是grep?要搜索空格而不是新行?如果重要的话,这是一个macOS。
答案 0 :(得分:2)
我不完全确定我理解你的问题,但是如果你只是想让你的正则表达式的部分匹配,你需要-o标志,例如:
groups $(whoami) | grep -io '[^[:blank:]]*access_ftp[^[:blank:]]*'
[^[:blank:]]*
匹配access_ftp
示例:
$ echo music com.apple.access_ftp video com.apple.access_ftp dialout | grep -Eo '[^[:blank:]]*access_ftp[^[:blank:]]*'
com.apple.access_ftp
com.apple.access_ftp
答案 1 :(得分:1)
您要求的解决方案涉及较少的正则表达式。尝试:
groups | awk '/access_ftp/' RS=' '
示例:
$ echo music com.apple.access_ftp video com.apple.access_ftp dialout | awk '/access_ftp/' RS=' '
com.apple.access_ftp
com.apple.access_ftp
Awk一次读入一个记录。 RS=' '
告诉awk使用空格作为记录分隔符。这样,每个单词都是记录。 /access_ftp/
告诉awk打印包含access_ftp
的任何记录。
groups | awk 'tolower($0) ~ /access_ftp/' RS=' '
示例:
$ echo music com.apple.access_ftp video com.apple.Access_FTP dialout | awk 'tolower($0)~/access_ftp/' RS=' '
com.apple.access_ftp
com.apple.Access_FTP
如果我们的搜索字符串可能在错误的情况下提供给我们:
$ echo music com.apple.access_ftp video com.apple.Access_FTP dialout | awk -v x="aCcess_ftp" 'tolower($0)~tolower(x)' RS=' '
com.apple.access_ftp
com.apple.Access_FTP
答案 2 :(得分:1)
如果你希望grep
处理单个单词而不是单词,最简单的方法就是用换行符替换所有空格:
groups $whoami | tr ' ' \\n | grep -i acess_ftp
答案 3 :(得分:0)
使用egrep -io '[a-z.]+?.access_ftp'
的惰性正则表达式匹配也应该这样做。