前言
作为研究僧,私以为:搞研究大多数是以发论文作为成果,那论文如何写的高大上呢,当然是用一堆看不懂的符号来表示啦,别人越是看不懂,那就越显示咱的高水平,当然古人也是这样想的!╮(╯▽╰)╭ 这篇文章呢,就来讲一下:如何低调奢华地处理字符串。下面就从正则表达式和grep&sed&tr&awk命令2个方面来看日常的用法!
正则表达式:
概述
1956年, Stephen Kleene就用正则表达式来描述他的神经网络事件。全世界都觉得很高大上!一举成名,后来,Unix之父:肯·汤普逊又开发了 qed 编辑器,主要用在于字符串的处理。慢慢的正则表达式就变得接地气了,半小时速成是没问题哒!“小正”最常用于以下3种场景:
- 1:匹配子串;
- 2:替换子串;
- 3:检测字符串格式。
另外呢,“小正”的移植性极佳,不论你是在windows上,还是在Linux上都可以使用,不光可以融入Python、Ruby等脚本语言,借助一些库函数,C/C++同样可以体验“小正”的强大魅力!可谓是,“小正”在手,查找无忧呀!
下面就详细讲讲“小正”的内容,本为以 /表达式/ 的形式来表示一个标准的正则表达式。
正则表达式字符集-普通字符
普通字符用于描述常规字符,可以直接匹配,(注意吆:“小正”的匹配是区分大小写的)
普通字符包含除元字符以外的ASCII表中的字符,包括字母、数字、标点符号、其他一些字符等。
举例:
/RegExp/ 可以从 字符串“Hello!my name is RegExp!” 中匹配“RegExp”正则表达式字符集-限定符
限定符用于描述匹配的次数,一共有* + ? {n} {n,} {n,m}6种。他们之间可以进行一定的等效于转化。
{n} 只匹配重复n次的串
{n,} 匹配重复出现n+次的串
{n,m} 匹配重复出现n-m次的串
* 匹配任意0次或多个出现的串,等效于{0,}
+ 匹配重复出现1次或多次的字符,等效于{1,}
? 匹配重复出现0次或一次的字符,等效于{0,1}注意以上匹配只对限定符前面的一个单位有效,该单位可以为普通字符或元字符
举例: /zo/ 可以匹配出 zo、zoo、z; 但是不能匹配zozo! /[^0-9]/ 可以匹配除数字以外的任意字符!
正则表达式字符集-定位符
定位符用于描述匹配对应的位置,进行边界匹配,包括^ $ \b \B 4种:
^ 匹配字符串开始或\n\r,注意:用在[^]中表示“非”的意思。
$ 匹配字符串结束或\n\r
\b 匹配单词边界
\B 匹配非单词边界举例:
/\bing*/可以匹配 `ingg`但是不能匹配 `amazing` !\B刚好相反。正则表达式字符集-特殊字符和序列
特殊字符是一些元字符,如果引用自身可以使用\字符来表示
除了前面说的元字符外,还有
() 子表达式的开始与结束
. 除\n以外的任意一个字符
\d [0-9]
\D [^0-9]
\s [ \f\n\r\t\v]
\S [^ \f\n\r\t\v]
\t 字表符
\v 垂直制表符
\w [A-Za-z0-9_]
\W [^A-Za-z0-9_]
\xn 匹配n为16进制字符,例如,'\x41' 匹配 "A" 中文字符:GBK [\x80-\xff]
\num 匹配 正整数num
\un 匹配n一个16进制表示unicode字符 中文字符 UTF-8 [\u4E00-\u9FA5]
\nm 匹配8进制转义符Linux下字符串匹配命令
grep 命令
grep 功能定位是搜索&截取 操作单位:行
使用格式:grep [选项] [模式] [file]
选项:
-n : 显示行号
-c : 输出行的数量
-I : 不区分大小写
-l : 输出文件名
-h : 不显示文件名
-r : 递归查询子目录下的文件
-v : 查找不包含文本的行举例:
grep 'hello' *.txt 查找所有txt的文件
cat file>grep 'test' 查找在file文件中包含test的行
grep -n '[a-z]\{5}\' aa 查找至少有5个连续小写字母的串及行号sed
sed 功能定位是匹配&增删改 操作单位:行
使用格式:sed [选项] [命令] [file]
sed是非交互式文本编辑器,适用于大文件的多种简单类型的编辑。sed处理时实际文件并没有被操作。除非使用-i选项,(不推荐使用!)
[常用选项]
- -n 只打印编辑行
- -e 多从命令,将下一个字符串解析为sed命令
- -f 执行sed脚本
- -i 直接原文编辑
[常用命令]
命令中的字符串可以使用正则表达式表示
a 新增, 下一行新增串 如:sed -n '/aa/a\bb\cc' file 在aa下一行插入bb cc两行。
c 取代, c 整行取代 如:cat file > sed -n "/734/c\Hello" 类似tr命令
d 删除, 删除固定的行 如:sed '1d' file 删除 file 里的第1行
i 插入, 上一行插入字符串 如:sed -n '/ccc/i\ddd' file
p 打印, 选择打印, 如: sed -n '3p' file 只打印第3行
s 取代, 类似vim中的替换, 如:sed 1,20s/old/new/g file
q 退出, 匹配到第1个终止匹配 如:sed -n '/^st/q'
w file, 匹配到的行写入某文件如: sed -n '/m/w out' in 从in中读带m的行写到out中举例:
sed -n '1,1d' file 删除第1行,什么内容也不显示
sed '/test/d' file 删除带 test 的行
sed '1,5c ccccc' file 1-5行替换为ccccc
sed '/test/c ccccc' file 用 ccccc 替换所有带 test 的行tr
tr 功能定位是删除&替换&去重 操作单位:文件
使用格式:tr [选项] [串1] [串2] [file]
-c 字符集补集替换(不太懂~)
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串举例:
将数字0-5替换为a-f:cat file | tr [0-5] [a-f]
删除文件file中出现的'a'b'c'字符:# cat file | tr -d "abc"
删除文件file中出现的换行'\n'、制表'\t'字符:# cat file | tr -d "\n\t"
删除连续重复字母,只保留第一个:# cat file | tr -s [a-zA-Z]
删除空行 :# cat file | tr -s "\n" > new_fileawk
awk 功能定位是分析&处理&格式化 操作单位:行
使用格式:awk '[条件1] [动作1] [条件2] [动作2]'
awk通常用于从具有一定结构的字符串中提取自己想要的信息,从而进行数据的筛选处理。awk语句定义了许多的内置变量,通过对内置变量的修改于访问,达到自己的要求。awk程序由一个主输入循环维持(代码一般被嵌到其中执行),主输入循环反复执行直到终止条件被触发。
内置变量:
BEGIN{} 主循环开始前执行{}中的内容
END{} 主循环结束后执行{}中的内容
FS 分隔符,默认为空格,可以通过awk -F'[:]' 或 awk '{FS=":"}' 修改
NF 每一行分割后的字段数
NR 当前处理到第几行
$0 代表整行数据
$n n>=1代表分割后的第n区域,可以通过{print $n}的形式输出逻辑运算: awk逻辑运算法则即字符与C语言基本相同。 运算符 > < >= <= == !== =
举例:
cat file | awk '{FS=":"} $3<10 {print $1 "\t" $3}' 以:分割,输出$1和$3并制表
cat file | awk 'BEGIN {FS=":"} {if($3==10 || $4==10) print $0}' 逻辑判断
cat file | awk /^$/{print "This is blank."} 匹配空行
cat file | awk 'BEGIN {FS=","} {printf("%-15s\t%d\n", $1, $3)}' 格式化输出
cat file | awk 'BEGIN {FS=":";OFS=":"} gsub(/old/, "new", $1) {print $0}' 替换$1上的字符串'awk 可以说具有完整的程序要素:变量、数组、循环…可以独立进行脚本程序设计,通过操作一些内置变量,实现需求。
调用方式:awk -f [awk脚本] [file] 比如一个简单的awk脚本:
#以 `,` 分割字符串,并对分割结果求平均
#!/bin/awk -f
BEGIN {FS=","}
{total=$4+$5+$6+$7+$8
avg=total/5
for(x=0;x<ARGC;x++)
print $1,avg,x
}混合使用
grep/sed/tr/awk 对比
grep偏向于查找,轻量级,容易掌握,配合find命令,还可以批量文件名查询~ sed 倾向于“增删改”,引入了很多对字符串修改的操作。 tr 也是“删改”算是轻量级的sed,有木有觉得方便使用和记忆?└(^o^)┘ awk偏向于处理格式化的数据,对数据的进一步处理与显示~
命令与“小正”
这些命令在查找字符串时用到的“模式” 都是可以使用“小正”来表示的呀。 能够灵活运用“小正”们可以达到事半功倍的效果呢!
总结
好啦,本篇就写到这了,当上机试一下后,你就会感受到“小正”的强大魅力。半个小时学会应该没问题吧,但是要常常温故知新,才能灵活运用呀~
本篇的主要目的是方便温习,很多内容写得不够详细,如果看不懂可以看下面的推荐网站。妹子的话,我可以亲自辅导吆~ O(∩_∩)O