grep - 包含标志的过滤器输入(例如%s)

时间:2015-06-28 21:31:44

标签: regex bash grep

我在跟随一块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

1 个答案:

答案 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,您的模式和参数只是不允许它与您输入的内容匹配。