我在跟随一块grep过滤器时很困难:
test="$(
grep -v "^#" "$file" | \
grep --word-regexp "\(,\s*\)\+google" | \
cut -d, -f1 | \
tr -d "[:blank:]"
)"
其中$file
是包含以下内容的文件:
# url,keyword,optional-keyword
https://google.com/search?q=%s,google,g
https://github.com/,gh,github
问题是,如果$file
包含带%s
标记的行,则上面的grep与以下行不匹配:
https://google.com/search?q=%s,google,g
但如果我用%-
替换该标志,则该行匹配。
如果标志是百分号,后跟字母字符,则grep与任何内容都不匹配
我怎么能设置grep所以它不会评估具有特殊含义的%s
?
答案 0 :(得分:3)
--word-regexp
要求匹配从行的开头开始,或者在非单词字符后立即开始。
https://google.com/search?q=%s,google,g
行后跟google
和/
后面的单词,
都是非单词字符,因此grep google
会匹配该行
但是,您的模式与符合该行中逗号的\(,\s*\)\+google
匹配,并且s
中的%s
后面的模式为s
,不是< / strong>非单词字符,因此--word-regexp
无法匹配。
如果您将%s
替换为该行中的%-
,那么当您的模式与逗号匹配时,紧接在前的字符是来自-
和%-
的{{1}} 是非单词字符,因此-
允许匹配。
tl; dr --word-regexp
没有以任何特殊方式处理grep
,您的模式和参数只是不允许它与您输入的内容匹配。