grep的小技巧
2024-08-29 05:42:41
grep '^[^#]' /etc/openvpn/server.conf
中括号必须匹配一个字符^$属于标志位,不属于字符
grep没把\n看成字符
grep把空行看成^$
还是perl的标准,空行看成^\n$
--------------------------------------------------------------------------------
^ 和 $ 表示位置,不占字符数,
^[^#]里的[^#]代表一个非'#'的字符(排除空行,因为空行没有字符存在),加上前面的'^',表示这个非'#'的字符必须在行首(排除注释行)
--------------------------------------------------------------------------------
关键应该是在于sed、grep等流编辑工具对行结尾符的理解,它们认为记录行尾的"$"就是标记新行的开始,不认为它在正则表达式的字符匹配范围内
换句话所就是sed、grep等不将换行符作为常规字符对待,仅视为文档标记,类似于C语言中会有文件结束符"EOF".
现在一些较高版本的sed、awk对字符串内嵌的换行符也是支持的,但无一例外的,对它们所定义分隔出的记录而言,必须有一个被视作记录结束的标记符,不是自定义的就是默认的"$"
这些被当做记录结束的标记字符如果出现在记录结尾它将被特殊对待.
明白这点后,对于"^[^#]"匹配不到空行也就好理解了,因为空行中没有可匹配的字符,仅仅有一个行位置标记符而已.
"#"的补集字符中不包含位置标记,所以问题可这样解决:
grep -nE '^[^#]*$'
注: "^[^#]*" 用来匹配非"#"开头但含字符的行
"^$" 用来匹配空行位置
这里不要从“过滤”的角度去理解。
要理解为“找出”。
grep -n "^[^#]" file ##找出非“#”(一个字符)开头的行。
以下为比喻,不是真实命令:
$cat room
一个姓张的人
一台电视
一个姓王的人
$ find '一个不是姓王的人' room ##find找出:如果有人叫你在房间里找一个不姓王的人,你必然会将姓张的那个人找出来,但不会将电视记也找出来。
一个姓张的人 #重点在一个'人' 类比找出含有#;的"字符"
$ disappear '一个不是姓王的人' room ##disappear消失:让“一个不是姓王的人”的人从房间里消失。那么姓张的人必然要消失的,但是“一台电视”该不该消失?
一台电视 ##是消失呢还是不消失?我的理解是不消失,正如楼主从“过滤”的角度理解grep -n "^[^#]" 因该不会过滤掉空行。
一个姓王的人
如上:
一个姓某某的人,相当于一某个普通字符
“一台电视” 相当于空行
最新文章
- C语言内存分配
- 更新日志 - fir.im 新版优化上线
- Luncene 学习入门
- java中局部变量和成员变量主要是他们作用域的区别
- DOS批处理命令-pause
- 判断jsp中是否存在某个javascript函数
- node 与php整合
- ♫【Underscore.js】
- Oracle order by case when 多条件排序
- (转)鸟哥SHELL入门材料
- nodejs安装指定版本
- 王立平--android事件监听的3种方式
- 站点系统压力測试Jmeter+Badboy
- iOS学习之路十三(动态调整UITableViewCell的高度)
- 用 NodeJS 实现 BigPipe
- JSP page指令
- Linux网络编程--wireshark分析TCP包头的格式
- 常见.NET功能代码汇总 (3)
- Python类的多态的例子
- ●BZOJ 2743 [HEOI2012]采花
热门文章
- 集合并发修改异常-foreach的时候不可修改值
- 【三十三】thinkphp之SQL查询语句(全)
- CSS3中only-child伪类选择器
- hihoCoder #1043 : 完全背包(板子题)
- Codeforces 626F Group Projects(滚动数组+差分dp)
- 修改mysql密码的四种方法
- Springboot-shiro-redis实现登录认证和权限管理
- Spring学习日志之Spring MVC启动配置
- Xtrabackup实现数据的备份与恢复
- ASP.NET没有魔法——ASP.NET MVC路由