grep - 3 Regex搭配浅谈

grep回顾
grep简介
grep - 2 用更多Option

Regexp

grep 可以搭配Regexp

Regex其实有分Basic Regexp(BRE)、Extended Regexp(ERE)、PerlRegexp

我这里只举出分别或差异, 如果...後面我想到要特别分享Regex在讲完整点

BRE ERE 描述
+ >=1次
? 可选用的匹配, i.e. 出现0或1次
| Or
\{n,m\} {n,m} 匹配前面文字n到m次
\(\) () BRE是Back Reference, EXE则是分组

在BRE里面遇到特殊符号像上面的{},(), 或者搜寻字串内真的是.*这种的,都需要透过\做转义

案例分享

# 准备假资料
cat > grepText.txt <<EOF
love loove live l0ve lOve l@ve
EOF

grep 'l[a-zA-Z0-9]*ve' grepText.txt 

https://ithelp.ithome.com.tw/upload/images/20210908/20104930ARH5mrIXTw.png
这里我们想找到满足l(中间是字母或数字)ve的, 搭配Regexp的话通常就是[a-zA-Z0-9]*
但Regex也提供特定字元\w用来比对所有字母或数字

grep 'l\w*ve' grepText.txt

https://ithelp.ithome.com.tw/upload/images/20210908/20104930NBQQU48iM8.png

也能去找到满足l(中间是非字母或数字)ve的, 搭配Regexp的话通常就是[^a-zA-Z0-9]*
^就是不包含以下字串的意思
也能透过\W来取代, 跟上面的\w比较, 这里是大写的W

grep 'l[^a-zA-Z0-9]*ve' grepText.txt; \
grep 'l\W*ve' grepText.txt

https://ithelp.ithome.com.tw/upload/images/20210908/20104930IPn0pLJZ4B.png

还有一种是字串边界(Word Boundary), 就是找出完整的单字, 但这找出来的单字, 不是某个字串内的字.
透过\<单字\>或是\b单字\b来找寻.

# 准备假资料
cat > grepText.txt <<EOF
love loove live l0ve lOve l@ve lovelove
EOF

grep '\<love\>' grepText.txt; \
> grep '\blove\b' grepText.txt 

https://ithelp.ithome.com.tw/upload/images/20210908/20104930QYZzf065iW.png

但如果我们把*想改成+至少一次
会不会成功呢?
会发现都找不到
https://ithelp.ithome.com.tw/upload/images/20210909/201049300ewGMWs2iA.png
不然就是要加上\跳脱符号

这是因为+是extended
grep 搭配 extended Regex, 则需要搭配option -E, 或者用grep家族中的egrep

grep  -E 'l[a-zA-Z0-9]+ve' grepText.txt; \ 
> egrep 'l[a-zA-Z0-9]+ve' grepText.txt 

https://ithelp.ithome.com.tw/upload/images/20210909/20104930OT11BzUofm.png

还有个比较少用的
grep -F和grep家族中的fgrep,
用来快速查找字串用, 但不支持Regexp.

本日小结

grep提供非常多种Regexp的支持, 下篇在继续分享.
在非常多文件, 或者文件内容非常多的时候, grep会非常好用又快速查找.

Question

能否用grep, 只取得这段文字中的数字呢?
累计文章数 5840篇 参赛组数 1087组 团队组数 052队 完赛人数 敬请期待

Ans:

echo "累计文章数 5840篇 参赛组数 1087组 团队组数 052队 完赛人数 敬请期待" | grep -oE '[0-9]{1,5}'
> 5840
> 1087
> 052

# 搭配Perl Regexp中的positive lookbehind, 找数字前面是空格的
# perl regexp这些用法日後再分享
echo "累计文章数 5840篇 参赛组数 1087组 团队组数 052队 完赛人数 敬请期待" | grep -oP '(?<= )\d+' 
> 5840
> 1087
> 052

<<:  Day 5 - [Zenbo开发系列] 02-建置与Zenbo规格相同的模拟器

>>:  D9-用 Swift 和公开资讯,打造投资理财的 Apps { 台股申购实作.2 -读取Big5码的csv}

[第二十八只羊] 迷雾森林顶尖对决 登入介面套版

天亮了 昨晚是平安夜 关於迷雾森林故事 香水 在场本来许多animal们牵着喜鹊儿的翅膀小手跳舞 都...

好想中乐透啊,Ruby 30 天刷题修行篇第十四话

嗨我是A Fei,连续好几天都十一点多回家,真的是累翻,先来看看今天的题目: Time to win...

JavaScript 运算子

运算子是函数 运算子事实上就是一种函数,有赋值运算子,比较运算子,算术运算子,位元运算子, 逻辑运算...

全端开发者必懂的「产品设计」——全端开发者内功 IV

from Unsplash 为什麽工程师也要懂产品设计? 前面笔记提过,现代科技秒新分异、资讯爆炸...

为了转生而点技能-javascript,day4(初探型别

动态型别 定义:变数会因为值性质的不同,而在***执行阶段***才会赋予确立型别有不同的型别;同一个...