shell编程之正则表达式与文本处理器

一、正则表达式

1.正则表达式的定义

正则表达式又称正规表达式、常规表达式。在代码中常简写为regexregexp RE。正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,简单来说,是一种匹配字符串的方法,通过一些特殊符号,实现快速查找、删除、替换某个特定字符串。

正则表达式是由普通字符与元字符组成的文字模式。模式用于描述在搜索文本时要匹 配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进 行匹配。其中普通字符包括大小写字母、数字、标点符号及一些其他符号,元字符则是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。

正则表达式一般用于脚本编程与文本编辑器中。很多文本处理器与程序设计语言均支持正则表达式,例如 Linux 系统中常见的文本处理器(grepegrepsedawk)以及应用比较广泛的 Python 语言。正则表达式具备很强大的文本匹配功能,能够在文本海洋中快速高效地处理文本

2.正则表达式的用途

对于一般计算机用户来说,由于使用到正则表达式的机会不多,所以无法体会正则表达式的魅力,而对于系统管理员来说,正则表达式则是必备技能之一。

正则表达式对于系统管理员来说是非常重要的,系统运行过程中会产生大量的信息,这些信息有些是非常重要的,有些则仅是告知的信息。身为系统管理员如果直接看这么多的信息数据,无法快速定位到重要的信息,如“用户账号登录失败”“服务启动失败等信息。这时可以通过正则表达式快速提取“有问题的信息。如此一来,可以将运维工作变得更加简单、方便。

目前很多软件也支持正则表达式,最常见的就是邮件服务器。在 Internet 中,垃圾/广告邮件经常会造成网络塞车,如果在服务器端就将这些问题邮件提前剔除的话,客户端就会减少很多不必要的带宽消耗。而目前常用的邮件服务器 postfix 以及支持邮件服务器的相关分析软件都支持正则表达式的对比功能。将来信的标题、内容与特殊字符串进行对比,发现问题邮件就过滤掉。

除邮件服务器之外,很多服务器软件都支持正则表达式。虽然这些软件都支持正则表达式,不过字符串的对比规则还需要系统管理员来添加,因此正则表达式是系统管理员必须掌握的技能之一。

3.基础正则表达式字符

基础正则表达式是常用的正则表达式部分

除了普通字符外,常见到以下元字符

\:转义字符,用于取消特殊符号的含义
例:\!、\n等

^:匹配字符串开始的位置
- 例:^a、^the、^#

$:匹配字符串结束的位置
例:word$

.:匹配除\n之外的任意的一个字符
例:go.d、g..d

*:匹配前面子表达式0次或者多次
例:goo* d、 go.*d

[^list]:匹配任意不在list列表中的一个字符
例:[^a-z]、[^0-9]、[^A-Z0-9]

\{n,m\}:匹配前面的子表达式n到m次,有\{n\}、\{n,\}、\{n,m\}三种格式
例:go\{2\}d、go\{2,3\}d、go\{2,\}d

4.扩展正则表达式

支持egrep、awk

扩展正则表达式是对基础正则表达式的扩充深化

扩展元字符
+:匹配前面子表达式1次以上
例:go+d,将匹配至少一个o

?:匹配前面子表达式0次或者1次
例:go?d,将匹配gd或god

():将括号中的字符串作为一个整体
例:(xyz)+,将匹配xyz整体1次以上,如xyzxyz

|:以或的方式匹配字条串
例:good|food,将匹配good或者food
例2:g(oo|la)d,将匹配good或者glad

\n匹配一个换行符

\r匹配一个回车符

\t匹配一个制表符

二、grep

1.grep常用选项

grep [选项]… 查找条件 目标文件

-a 不要忽略二进制数据。

-A<显示列数> 除了显示符合范本样式的那一行之外,并显示该行之后的内容。

-b 在显示符合范本样式的那一行之外,并显示该行之前的内容。

-c 计算符合范本样式的列数。

-C<显示列数>或-<显示列数>  除了显示符合范本样式的那一列之外,并显示该列之前后的内容。

-d<进行动作> 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep命令将回报信息并停止动作。-e<范本样式> 指定字符串作为查找文件内容的范本样式。

-E 将范本样式为延伸的普通表示法来使用,意味着使用能使用扩展正则表达式。

-f<范本文件> 指定范本文件,其内容有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每一列的范本样式。

-F 将范本样式视为固定字符串的列表。

-G 将范本样式视为普通的表示法来使用。

-h 在显示符合范本样式的那一列之前,不标示该列所属的文件名称。

-H 在显示符合范本样式的那一列之前,标示该列的文件名称。

-i 忽略字符大小写的差别。

-l 列出文件内容符合指定的范本样式的文件名称。

-L 列出文件内容不符合指定的范本样式的文件名称。

-n 在显示符合范本样式的那一列之前,标示出该列的编号。

-q 不显示任何信息。

-R/-r 此参数的效果和指定“-d recurse”参数相同。

-s 不显示错误信息。

-v 反转查找。

-w 只显示全字符合的列。

-x 只显示全列符合的列。

-y 此参数效果跟“-i”相同。

-o 只输出文件中匹配到的部分。

2.grep案例

(1)查找搜索字符

方法一:grep -c root /etc/passwd

方法二:cat /etc/passwd | grep root

(2)不区分大小写查找

 grep -i "root" /etc/passwd    #不区分大小写查找目录下含有root的

(3)取反查找

grep -v root /etc/passwd     #取反查找,将没有root的行显示出来

3.元字符

 1.创建一个测试文件

文件内容自行编撰

 2.查找特定字符

(1)查看包含the的行

[root@localhost ~]# grep -ni 'the' test.txt

3:The home of Football on BBC Sport online.

4:the tongue is boneless but it breaks bones.12!

5:google is the best tools for search keyword.

注释:

-n:显示行号

-i:不区分大小写

-v:不包含指定字符

(2)利用[ ]查找集合字符

[root@localhost ~]# grep -n 'sh[io]rt' test.txt

1:he was short and fat.

2:he was weating a blue polo shirt with black pants.

注释:

[ ]:中括号内不管写几个字符,都只匹配一个,表示匹配其中的任何一个字符

(3)查找字母oo前不是字母w的内容

[root@localhost ~]# grep -n '[^w]oo' test.txt 

3:The home of Football on BBC Sport online.

5:google is the best tools for search keyword.

9:#woood #

10:#woooooooood #

12:I bet this place is really spooky late at night!

(4)查看字母oo前不是小写字母的内容

[root@localhost ~]# grep -n '[^a-z]oo' test.txt

3:The home of Football on BBC Sport online.

注释:字母前直接用^,表示取反

      [   ]前用^,表示以括号中的字符开头

3.查找行首与行位

(1)查看以the为行首的行

[root@localhost ~]# grep -n '^the' test.txt

4:the tongue is boneless but it breaks bones.12!

(2)查询以小写字母开头的行

[root@localhost ~]# grep -n '^[a-z]' test.txt

1:he was short and fat.

2:he was weating a blue polo shirt with black pants.

4:the tongue is boneless but it breaks bones.12!

5:google is the best tools for search keyword.

7:a wood cross!

(3)查询以大写字母开头的行

[root@localhost ~]# grep -n '^[A-Z]' test.txt

3:The home of Football on BBC Sport online.

6:PI=3.14

8:Actions speak louder than words

11:AxyzxyzxyzxyzC

12:I bet this place is really spooky late at night!

13:Misfortunes never come alone/single.

14:I shouldn't have lett so tast.

(4)查看以非字母开头的行

[root@localhost ~]# grep -n '^[^a-zA-Z]' test.txt

9:#woood #

10:#woooooooood #

(5)查看以点结尾的行

[root@localhost ~]# grep -n '\.$' test.txt

1:he was short and fat.

2:he was weating a blue polo shirt with black pants.

3:The home of Football on BBC Sport online.

5:google is the best tools for search keyword.

13:Misfortunes never come alone/single.

14:I shouldn't have lett so tast.

(6)查询空行

[root@localhost ~]# grep -n '^$' test.txt

注释:查询非空行

[root@localhost ~]# grep -n -v '^$' test.txt

4.查找任意字符和重复字符

(1)查找包含四字符的单词的行,单词以w开头,以d结尾

[root@localhost ~]# grep -n 'w..d' test.txt

5:google is the best tools for search keyword.

7:a wood cross!

8:Actions speak louder than words

注释:

一个点代表一个字符

(2)查询至少包含两个字母o(oo)字符串的行

[root@localhost ~]# grep -n 'ooo*' test.txt

3:The home of Football on BBC Sport online.

5:google is the best tools for search keyword.

7:a wood cross!

10:#woood #

11:#woooooooood #

13:I bet this place is really spooky late at night!

注释:

ooo*:前两个o是条件,表示包含两个o;然后是o*,表示后面有零个或多个重复o

(3)查找行,行中单词包含w开头和d结尾,中间至少一个字母o

[root@localhost ~]# grep -n 'woo*d' test.txt

7:a wood cross!

10:#woood #

11:#woooooooood #

(4)查询以w开头,d结尾,中间字符可有可无

[root@localhost ~]# grep -n 'w.*d' test.txt 

1:he was short and fat.

5:google is the best tools for search keyword.

7:a wood cross!

8:Actions speak louder than words

10:#woood #

11:#woooooooood #

(5)查询包含数字的行

[root@localhost ~]# grep -n '[0-9][0-9]*' test.txt

4:the tongue is boneless but it breaks bones.12!

6:PI=3.14

5.查找连续字符范围

(1)查询包含两个o的字符

[root@localhost ~]# grep -n 'o\{2\}' test.txt

3:The home of Football on BBC Sport online.

5:google is the best tools for search keyword.

7:a wood cross!

10:#woood #

11:#woooooooood #

13:I bet this place is really spooky late at night!

注释:

'o\{2\}':表示两个字母o

(2)w开头,d结尾中间有2--5个o

[root@localhost ~]# grep -n 'wo\{2,5\}d' test.txt

7:a wood cross!

10:#woood #

(3)w开头,d结尾中间有2个以上o

7:a wood cross!

10:#woood #

11:#woooooooood #

6.扩展正则表达式

[root@localhost ~]# grep -v '^$' /etc/ssh/sshd_config | grep -v '^#'

用扩展正则表达式表示:

[root@localhost ~]# egrep -v '^$|^#' /etc/ssh/sshd_config

三、文本处理器sed

sedStream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据

指定的条件对文本内容进行编辑(删除、替换、添加、移动等),最后输出所有行或者仅输

出处理的某些行。sed 也可以在无交互的情况下实现相当复杂的文本处理操作,被广泛应用

Shell 脚本中,用以完成各种自动化处理任务。

sed 的工作流程主要包括读取、执行和显示三个过程。

读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。

执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。

显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空

1:sed常用选项

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端

2:sed常用操作

a :新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
c :取代行, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
i :插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如1,20s/old/new/g 一般是替换符合条件的字符串而不是整行

y:字符转换

3:输出符合条件的文本

(1)输出所有内容

[root@localhost ~]# sed -n 'p' test.txt

(2)输出第三行

[root@localhost ~]# sed -n '3p' test.txt

(3)输出3~5行

[root@localhost ~]# sed -n '3,5p' test.txt

(4)输出所有奇数行

[root@localhost ~]# sed -n 'p;n' test.txt

(5)输出所有偶数行

[root@localhost ~]# sed -n 'n;p' test.txt

(6)输出第1~5行之间的奇数行

[root@localhost ~]# sed -n '1,5{p;n}' test.txt

(7)输出第10行至文件尾之间的偶数行

[root@localhost ~]# sed -n '10,${n;p}' test.txt

注释:

此命令中,读取的第一行是文件的第10行,读取的第二行,是文件的第11行,依次类推

(8)输出包含the的行

[root@localhost ~]# sed -n '/the/p' test.txt

(9)输出从第4行开始至第一个包含the的行

[root@localhost ~]# sed -n ' 4,/the/p' test.txt

[root@localhost ~]# sed -n '/the/=' test.txt

(10)输出包含the的行所在的行号

[root@localhost ~]# sed -n '/the/=' test.txt

注释:

=用来输出行号

(11)输出以PI开头的行

[root@localhost ~]# sed -n '/^PI/p' test.txt

(12)输出包含单词wood的行

[root@localhost ~]# sed -n '/\<wood\>/p' test.tx

4:删除符合条件的文本

(1)删除第3行

[root@localhost ~]# nl test.txt | sed '3d' ##显示行号

[root@localhost ~]# sed '3d' test.txt ##不显示行号

(2)删除3~5行

[root@localhost ~]# nl test.txt |sed '3,5d'

(3)删除包含cross的行

[root@localhost ~]# nl test.txt |sed '/cross/d'

注释:删除不包含cross的行

[root@localhost ~]# nl test.txt |sed '/cross/! d'

(4)删除以小写字母开头的行

[root@localhost ~]# sed '/^[a-z]/d' test.txt

(5)删除以点结尾的行

[root@localhost ~]# sed '/\.$/d' test.txt

(6)删除空行

[root@localhost ~]# sed '/^$/d' test.txt

5:替换符合条件的文本

(1)将每行的第一个the换成THE

[root@localhost ~]# sed 's/the/THE/' test.txt

(2)将每行中的第2个l换成L

[root@localhost ~]# sed 's/l/L/2' test.txt

(3)将文中所有的the换成THE

[root@localhost ~]# sed 's/the/THE/g' test.txt

(4)将文中所有的o删除

[root@localhost ~]# sed 's/o//g' test.txt

(5)在每行的行首插入#

[root@localhost ~]# sed 's/^/#/' test.txt 

注释

在每行行尾添加#

[root@localhost ~]# sed 's/$/#/' test.txt 

(6)在包含the的每行的行首插入#

[root@localhost ~]# sed '/the/s/^/#/' test.txt 

(7)在每行的行尾插入字符串EOF

[root@localhost ~]# sed 's/$/EOF/' test.txt

(8)将第3~5行中的所有the替换成THE

[root@localhost ~]# sed '3,5s/the/THE/g' test.txt

(9)将包含the的所有行中的o都替换成O

[root@localhost ~]# sed '/the/s/o/O/g' test.txt

5:迁移符合条件的文本

H:复制到剪切板

g:将剪切板中的内容覆盖到指定行

G:将剪切板中的内容追加到指定行

w:保存文件

r:读取指定文件

a:追加指定内容

(1)将包含the的行迁移至文件的末尾

[root@localhost ~]# sed '/the/{H;d};$G' test.txt

(2)将第1~5行的内容转移至第17行后

[root@localhost ~]# sed '1,5{H;d};17G' test.txt

(3)将包含the的行另存为文件out.txt

[root@localhost ~]# sed '/the/w out.txt' test.txt

(4)将文件/etc/hostname的内容添加到包含the的每一行后

[root@localhost ~]# sed '/the/r /etc/hostname' test.txt 

(5)在第3行后插入一个新行,内容为#chkconfig:35 82 20

[root@localhost ~]# sed '3a#chkconfig:35 82 20' test.txt

(6)在包含the的每行后插入一个新行,内容为New

[root@localhost ~]# sed '/the/aNew' test.txt 

(7)在第3行后插入多行内容

[root@localhost ~]# sed '3aNew1\nNew2' test.txt

注释:\n为换行,添加两行为New1和New2

四、文本处理器awk

awk 是一个功能强大的编辑工具,逐行读取输入文本,并根据指定的匹配模式进行查找,对符合条件的内容进行格式化输出或者过滤处理

1:awk常见用法

$0           表示整个当前行

$1           每行第一个字段

NF          字段数量变量

NR          每行的记录号,多文件记录递增

FNR        与NR类似,不过多文件记录不递增,每个文件都从1开始

\t            制表符

\n           换行符

FS          BEGIN时定义分隔符

RS       输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)

~            匹配,与==相比不是精确比较

!~           不匹配,不精确比较

==         等于,必须全部相等,精确比较

!=           不等于,精确比较

&&     逻辑与

||             逻辑或

+            匹配时表示1个或1个以上

/[0-9][0-9]+/   两个或两个以上数字

/[0-9][0-9]*/    一个或一个以上数字

FILENAME 文件名

OFS      输出字段分隔符, 默认也是空格,可以改为制表符等

ORS        输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕

-F'[:#/]'   定义三个分隔符

2:awk案例

(1)按行输出文本

awk -F":" '{print}' /etc/passwd //输出所有

awk -F":" '{print $0}' /etc/passwd //输出所有

awk -F: 'NR==3,NR==6{print}' /etc/passwd  //显示第3行到第6行

awk -F: 'NR>=3&&NR<=6{print}' /etc/passwd       //显示第3行到第6行

awk -F: 'NR==3||NR==6{print}' /etc/passwd       //显示第3行和第6行

awk '(NR%2)==1{print}' /etc/passwd //显示奇数行

awk '(NR%2)==0{print}' /etc/passwd //显示偶数行

awk '/^root/{print}' /etc/passwd //显示以root开头的行

awk '/nologin$/{print}' /etc/passwd //显示以nologin结尾的行

awk 'BEGIN {x=0};/\/bin\/bash$/{x++};END {print x}' /etc/passwd      //统计以/bin/bash结尾的行数

awk 'BEGIN{RS=""};END{print NR}' /etc/ssh/sshd_config //统计以空行分隔的文本段落数

awk '{print NR,$0}' /etc/passwd                                 //输出每行的行号

awk -F: '{print NR,NF,$NF,"\t",$0}' /etc/passwd      //依次打印行号,字段数,最后字段值,制表符,每行内容

awk -F: 'NR==5{print}'  /etc/passwd                         //显示第5行

route -n|awk 'NR!=1{print}'                                       //不显示第一行

awk -F: '{print NF}' /etc/passwd                                //显示每行有多少字段

awk -F: '{print $NF}' /etc/passwd                              //将每行第NF个字段的值打印出来

 awk -F: 'NF==4 {print }' /etc/passwd                       //显示只有4个字段的行

awk -F: 'NF>2{print $0}' /etc/passwd                       //显示每行字段数量大于2的行

(2)按字段输出文本

awk -F":" '{print $3}' /etc/passwd //显示第三列

awk -F":" '{print $1 $3}' /etc/passwd                       //$1与$3相连输出,无空格,

awk -F":" '{print $1,$3}' /etc/passwd                       //多了一个逗号,输出第1和第3个字段,有空格

awk -F: '$2=="!!" {print}' /etc/shadow //统计密码为空的shadow记录

awk 'BEGIN {FS=":"}; $2=="!!" {print}' /etc/shadow ##显示密码为空的用户的shadow信息

awk -F ":" '$7~"/bash" {print $1}' /etc/passwd ##显示第七个字段为/bash的行的第一个字段

awk -F: 'NR==5{print}' /etc/passwd                         //显示第5行

awk -F":" '{print $1 " " $3}' /etc/passwd                  //$1与$3之间手动添加空格分隔

(3)通过管道、双引号调用shell命令

awk -F: '/bash$/{print | "wc -l"}' /etc/passwd     ##统计bash用户的个数

awk 'BEGIN {while ("w" | getline) n++ ; {print n-2}}'   ##统计在线用户的数量

awk 'BEGIN {"hostname" | getline;print $0}'      ##输出当前主机名

awk -F: '$1~/mail/ && $3>6 {print }' /etc/passwd         //逻辑与,$1匹配mail,并且$3>6

awk -F: '{if($1~/mail/ && $3>8) print }' /etc/passwd  

awk -F: '$1~/mail/ || $3>1000 {print }' /etc/passwd       //逻辑或,统计以mail开头或第3列大于1000的行

awk -F: '{if($1~/mail/ || $3>1000) print }' /etc/passwd 

五、sort工具

Linux 系统中,常用的文件排序工具有三种:sortuniqwc 。本章将介绍前两种

工具的用法。

sort 是一个以行为单位对文件内容进行排序的工具,也可以根据不同的数据类型来排

序。例如数据和字符的排序就不一样。sort 命令的语法为“sort [选项] 参数,其中常用的选

项包括以下几种。

 -f:忽略大小写;

 -b:忽略每行前面的空格;

 -M:按照月份进行排序;

Ø-n:按照数字进行排序;

 -r:反向排序;

  -u:等同于 uniq,表示相同的数据仅显示一行;

 -t:指定分隔符,默认使用[Tab]键分隔;

 -o <输出文件>:将排序后的结果转存至指定文件;

 -k:指定排序区域。

示例 1:将/etc/passwd 文件中的账号进行排序。

[root@localhost ~]# sort /etc/passwd

示例 2:将/etc/passwd 文件中第三列进行反向排序。

[root@localhost ~]# sort -t ':' -rk 3 /etc/passwd

备注:

 -r:反向排序;

 -t:指定分隔符,默认使用[Tab]键分隔;

 -k:指定排序区域。

示例 3:将/etc/passwd 文件中第三列进行排序,并将输出内容保存至 user.txt 文件中。

[root@localhost ~]# sort -t ':' -k 3 /etc/passwd -o user.txt

[root@localhost ~]# cat user.txt

备注:

 -t:指定分隔符,默认使用[Tab]键分隔;

 -k:指定排序区域。

六、uniq工具

Uniq 工具在 Linux 系统中通常与 sort 命令结合使用,用于报告或者忽略文件中的重复

行。具体的命令语法格式为:uniq [选项] 参数。其中常用选项包括以下几种。

 -c:进行计数;

 -d:仅显示重复行;

 -u:仅显示出现一次的行。

示例 1:删除 testfile 文件中的重复行

[root@localhost ~]# cat testfile

Linux 10

Linux 20

Linux 30

Linux 30

Linux 30

CentOS 6.5

CentOS 6.5

CentOS 6.5

CentOS 7.3

CentOS 7.3

CentOS 7.3

[root@localhost ~]# uniq testfile

Linux 10

Linux 20

Linux 30

CentOS 6.5

CentOS 7.3

示例 2:删除 testfile 文件中的重复行,并在行首显示该行重复出现的次数。

[root@localhost ~]# uniq -c testfile

1 Linux 10

1 Linux 20

3 Linux 30

3 CentOS 6.5

3 CentOS 7.3

备注:

 -c:进行计数;

示例 3:查找 testfile 文件中的重复行。

[root@localhost ~]# uniq -d testfile

Linux 30

CentOS 6.5

CentOS 7.3

备注:

 -d:仅显示重复行;

七、tr工具

 命令常用来对来自标准输入的字符进行替换、压缩和删除。可以将一组字符替换之后

变成另一组字符,经常用来编写优美的单行命令,作用很强大。

其常用选项包括以下内容。

 -c:取代所有不属于第一字符集的字符;

 -d:删除所有属于第一字符集的字符;

 -s:把连续重复的字符以单独一个字符表示;

 -t:先删除第一字符集较第二字符集多出的字符。

示例 1:将输入字符由大写转换为小写。

[root@localhost ~]# echo "KGC" | tr 'A-Z' 'a-z'

kgc

示例 2:压缩输入中重复的字符。

[root@localhost ~]# echo "thissss is a text linnnnnnne." | tr -s 'sn'

this is a text line.

备注:

 -s:把连续重复的字符以单独一个字符表示;

示例 3:删除字符串中某些字符

[root@localhost ~]# echo 'hello world' | tr -d 'od'

hell wrl

备注:

 -d:删除所有属于第一字符集的字符;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值