正则表达式
解释
REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能,类似于增强版的通配符功能,但与通配符不同,通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符。
正则表达式被很多程序和开发语言所广泛支持:vim, less,grep,sed,awk, nginx,mysql等
主要用来匹配字符串(命令结果,文本内容),
通配符只用于匹配文件名、目录名等,不能用于匹配文件内容。(而且是已存在的文件或者目录)
通配符主要是为了方便用户对文件或者目录的描述,
例如用户仅仅需要以".sh"结尾的文件时,使用通配符就能很方便地实现。
各个版本的shell都有通配符,这些通配符是一些特殊的字符,
用户可以在命令行的参数中使用这些字符,进行文件名或者路径名的匹配。
shell将把与命令行中指定的匹配规则符合的所有文件名或者路径名作为命令的参数,
然后执行这个命令。
例如
*:通配符匹配任意一个或多个字符
ls *.txt
?:通配符
匹配一个任意字符
[root@localhost opt]# ls ?.txt
[] 通配符
[list] 匹配list中任意单个字符
ls [a-z].txt
元字符:
- . 匹配任意单个字符,可以是一个汉字
- () 使用转义符,只表示()
- [] 匹配指定范围内的任意单个字符,示例:[dn] [0-9] [] [a-zA-Z] [:alpha:]
- [^] 匹配指定范围外的任意单个字符,示例:[dn][a.z]
- [:alnum:] 字母和数字 [0-9] [a-z] [0-9] [a-z]
- [:alpha:] 代表任何英文大小写字符,亦即 [A-Z], [a-z]
- [:lower:] 小写字母,示例:[[:lower:]],相当于[a-z]
- [:upper:] 大写字母 [A-Z]
- [[:blank:]] 空白字符(空格和制表符)
- [:space:] 包括空格、制表符(水平和垂直)、换行符、回车符等各种类型的空白
- [:blank:]包含的范围广
- [:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
- [:digit:] 十进制数字
- [:xdigit:]十六进制数字
- [:graph:] 可打印的非空白字符
- [:print:] 可打印字符
- [:punct:] 标点符号
- \w #匹配单词构成部分,等价于[_[:alnum:]]
- \W #匹配非单词构成部分,等价于[^_[:alnum:]]
- \S #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
- \s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]
示例
[root@localhost ~]#ls /etc/|grep rc[.0-6]
ls /etc/命令会列出/etc/目录下的所有文件和子目录,
| 符号用于将其输出作为grep命令的输入。
grep命令使用正则表达式rc[.0-6]来匹配文件名中包含rc加数字(0-6)的文件或目录名,
其中方括号[]表示字符集,[.0-6]表示匹配.和0-6这些字符中的任意一个。
#此处的点代表字符
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
[root@localhost ~]# ls /etc/ | grep 'rc\.' #只匹配已rc.开头的文件
#点值表示点需要转义
rc.d
rc.local
[root@localhost ~]# ls /opt | grep "t." #过滤出仅包含字母"t"后跟任何其他字符的行。
[root@localhost ~]# grep 'r..t' /etc/passwd
#r..t ..代表任意两个字符
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost ~]# echo abc |grep a.c
#表示原来的点需要加\转义
abc
[root@localhost ~]# echo abc |grep a\.c
#不加引号有时匹配会有出入
abc
[root@localhost ~]# echo abc |grep 'a\.c'
#标准格式需要加'' 或者""
[root@localhost ~]# ls |grep '[fhtx].txt'
#匹配[]中任意一个字符
f.txt
h.txt
t.txt
x.txt
[root@localhost ~]# ls [a-d].txt
#通配符
a.txt A.txt b.txt B.txt c.txt C.txt d.txt
[root@localhost ~]# ls | grep '[a-d].txt'
#真正的小写在正则表达式中
a.txt
b.txt
c.txt
d.txt
[root@localhost ~]# ls |grep '[^a-z].txt'
#显示非小写字母
A.txt
B.txt
[root@localhost ~]# ls |grep '[^a.z].txt'
#“[^a.z]”表示不匹配字母“a”或“z”的任何字符
space空格
[root@localhost ky15]# grep [[:space:]] 123.txt
hhh
jj l
kkk
[a-zA-Z] #同时匹配大小写
表示次数
* | #匹配前面的字符任意次,包括0次,贪婪模式:尽可能长的匹配 |
---|---|
.* | #任意长度的任意字符,不包括0次,也就是匹配所有 |
? | #匹配其前面的字符出现0次或1次,即:可有可无 |
+ | #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次 |
{n} | #匹配前面的字符=n次 |
{m,n} | #匹配前面的字符至少m次,至多n次 |
{,n} | #匹配前面的字符至多n次,<=n |
{n,} | #匹配前面的字符至少n次 |
举例
[root@localhost ~]# echo google | grep 'go\{2\}gle'
#代表前面的o出现2次
google
[root@localhost ~]# echo gooooogle |grep 'go\{2,\}gle'
#代表前面的o出现2次以上
gooooogle
[root@localhost ~]# echo gooooogle |grep 'go\{2,5\}gle'
#代表前面的o出现2次以上5次以下
gooooogle
[root@localhost ~]# echo goooooogle |grep 'go\{2,5\}gle'
#表示前面的o最少出现2次,最多出现5次,匹配不到
[root@localhost opt]# echo goooooogle |grep 'go\{,5\}gle'
#匹配前面的字符至多n次
[root@localhost ~]# echo goooooogle |grep 'go*gle'
#表示0次到任意次
goooooogle
[root@localhost ~]# echo ggle |grep "go*gle"
ggle
[root@localhost ~]# echo gggle |grep "go*gle"
#grep 包含最前面的g不匹配
gggle
[root@localhost ~]# echo gdadadadgle |grep "g.*gle"
#.*代表任意匹配所有
gdadadadgle
[root@localhost ~]# echo ggle |grep "go\?gle"
# \?一次或者0次
ggle
[root@localhost ~]# echo gogle |grep "go\?gle"
gogle
[root@[root@localhost ~]# echo google |grep "go\+gle"
#一个以上
google
[root@localhost ~]# echo gogle |grep "go\+gle"
gogle
[root@localhost ~]# echo ggle |grep "go\+gle"
[root@localhost ~]# echo google |grep "go\?gle"
ifconfig ens33|grep netmask|grep -o
ifconfig ens33|grep netmask|grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+'|head -n1
ifconfig ens33|grep netmask|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'
位置锚定
^ | #行首锚定, 用于模式的最左侧 |
---|---|
$ c^root$ | #用于模式匹配整行 (单独一行 只有root) |
^$ | #空行 |
1*$ | #空白行 |
< 或 \b | #词首锚定,用于单词模式的左侧(连续的数字,字母,下划线都算单词内部) |
> 或 \b | #词尾锚定,用于单词模式的右侧 |
<root> | #匹配整个单词 |
例子
思考过滤出不是已#号开头的非空行
[root@localhost ~]#grep "^[^#]" /etc/fstab
[root@localhost data]#grep "^google$" test.txt
#只匹配google 这个字符
[root@localhost ~]#grep "^[[:space:]]*$" /etc/fstab
[root@localhost ~]#echo hello-123 |grep "\b123"
#除了 字母 数字 下划线其他都算 单词的分隔符
hello-123
[root@localhost ~]#echo hello-123 |grep "\bhello"
hello 123
[root@localhost opt]# echo hello-123 |grep "\bo-123" #已o为开头就匹配不到了,只能定义开头和结尾
分组或其他
- 分组:()
- 或者:|
示例
[root@localhost ~]#echo abccc |grep "abc\{3\}"
abccc
[root@localhost ~]#echo abcabcabc |grep "\(abc\)\{3\}"
#分组 匹配abc
abcabcabc
[root@localhost ~]#echo abcabcabc |grep "\(ab\)\{3\}" 思考能不能匹配,为什么不能匹配?要连续的出现才能匹配
[root@localhost opt]# echo golgogle | grep '\(go\)\{1\}'
golgogle
[root@localhost opt]# echo golgogle | grep '\(go\)\{1\}gle' #只能匹配后面的
golgogle
[root@localhost ~]#echo 1abc |grep "1\|2abc"
#只匹配了1
1abc
[root@localhost ~]#echo 1abc2abc |grep "\(1\|2\)abc"
#1abc或者2abc
1abc2abc
扩展正则表达式(表示字符相差不大)
- grep -E 必须用 sed -r
- egrep
表示次数
* | 匹配前面字符任意次 |
---|---|
? | 0或1次 |
+ | 1次或多次 |
{n} | 匹配n次 |
{m,n} | 至少m,至多n次 |
{,n} | #匹配前面的字符至多n次,<=n,n可以为0 |
{n,} | #匹配前面的字符至少n次,<=n,n可以为0 |
表示分组
() 分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)
| 或者
a|b #a或b
C|cat #C或cat
(C|c)at #Cat或cat
ifconfig ens33|grep netmask|grep -E '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]'
表示邮箱
echo "544564317@qq.com" | grep -E "[0-9]+@[a-z]+\.[a-z]+"
表示手机号
echo "13770725194"|grep -E "\b1[3456789][0-9]{9}\b"
[root@localhost opt]# echo "13770725194" | grep -E "1[3456789][0-9]{9}"
13770725194
重点命令部分
grep
grep [选项]… 查找条件 目标文件
选项:
-m | # 匹配#次后停止 |
---|---|
-v | 显示不被pattern匹配到的行,即取反 |
-i | 忽略字符大小写 #可有可无 |
-n | 显示匹配的行号 |
-c | 统计匹配的行数 |
-o | 仅显示匹配到的字符串 |
-q | 静默模式,不输出任何信息 |
-A | # after, 后#行 |
-B | # before, 前#行 |
-C | # context, 前后各#行 |
-e | 实现多个选项间的逻辑or关系,如:grep –e ‘cat ’ -e ‘dog’ file |
-w | 匹配整个单词 |
-E | 使用ERE,相当于egrep,使用扩展正则 |
-F | 不支持正则表达式 |
-f | file 根据模式文件,处理两个文件相同内容 把第一个文件作为匹配条件 |
-r | 递归目录,但不处理软链接 |
-R | 递归目录,但处理软链接 |
grep -m 1 root /etc/passwd #多个匹配只取第一个
grep -Ev '^[[:space:]]*#|^$' /etc/fstab
grep -c root /etc/passwd #统计匹配到的行数
grep -A3 root /etc/passwd #匹配到的行的后3行也显示出来
grep -e root -e bash /etc/passwd #包含root或者包含bash 的行
grep -w root /etc/passwd
示例
[root@localhost opt]# grep -f 123.txt 456.txt #匹配两个文件中内容相同的部分
a
b
c
ee
[root@localhost opt]# grep -r a /opt #递归过滤目录中的文件
匹配到二进制文件 /opt/.yonghu.sh.swp
/opt/123.txt:a
/opt/456.txt:a
[root@localhost opt]# ln -s 123.txt b
[root@localhost opt]# grep -R a /opt
匹配到二进制文件 /opt/.yonghu.sh.swp
/opt/123.txt:a
/opt/456.txt:a
/opt/b:a
[root@test1 opt]# cat 123.txt |grep -v '^$' >test.txt //将非空行写入到test.txt文件
[root@test1 opt]# grep "^b" 123.txt //过滤已b开头
[root@test1 opt]#grep '/$' 123.txt //过滤已/结尾
sort
以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序
语法格式:
sort 选项 参数
cat file | sort 选项
常用选项:
- -f:忽略大小写,默认会大写字母排在前面
- -b:忽略每行前面的空格
- -n:按照数字进行排序
- -r:反向排序
- -u:等同uniq,表示相同的数据仅显示一行,去重
- -t:指定字段分隔符,默认使用tab键分隔
- -k:指定排序字段
- -o <输出文件>:将排序后的结果转存至指定文件
sort -n test.txt ---按数字大小进行排序
sort -n -r test.txt ---倒序排列
sort -u test.txt ---重复的数据只展示一次,相当于去重
cat /etc/passwd | sort -o ky27.txt ---把整个passwd的文件,传给kgc.txt
cat -n /etc/passwd | sort -n -o ky27.txt #按照源文件的顺序传
uniq
uniq命令用于报告或者忽略文件中连续的重复行,常与sort命令结合使用。
格式:
uniq [选项] 参数
cat 文件| uniq 选项
选项
- -c 统计连续重复的行的次数,并且合并重复的行
- -u 显示仅出现一次的行(包括不连续的重复行)
- -d 仅显示重复出现的行(必须是连续的重复行)
uniq -u test.txt ---只显示出现一次的行
uniq -d test.txt ---只显示连续重复的行
sort -n test.txt | uniq -c ---对重复的数据行计数,并且去重输出
sort -n test.txt | uniq -u ---只展示不重复的数据行
sort -n test.txt | uniq -d ---只展示重复的数据行
tr
tr 选项 参数
常用选项:
- -c:保留字符集1的字符,其他的字符(包括换行符\n)用字符集2替换
- -d:删除所有属于字符集1的字符
- -s:将重复出现的字符串压缩为一个字符串,用字符集2 替换 字符集1
- -t:字符集2 替换 字符集1,不加也行
参数:
字符集1:
指定要转换或删除的原字符集。当执行转换操作时,
必须使用参数”字符集2“指定转换操作时,必须使用参数”字符集2“指定转换的目标字符集。
但执行删除操作时,不需要参数”字符集2“
字符集2:
指定要转换成的目标字符集
echo 192.168.233.22 | tr '.' ' ' ---把"." ,替换成空格
echo ABC | tr "A-Z" "a-z" ---大写替换成小写
echo abc | tr -c 'ab' 'a' ---保留了ab,替换了c,输出aa
echo abc | tr -d 'ab' ---删除ab,打印c
sort -n test.txt | tr -s '\n' ----排序输出,压缩空行为一个
echo $PATH | tr -s ":" "\n" ---把":"替换为换行
cut
对字段进行截取和剪裁
格式
格式一:cut [选项] 参数
格式二:cat file | cut [选项]
选项
- -d 指定分隔符(默认分隔符为Tab)
- -f 按字段进行截取。指定第n个字段;
- -b 以字节为单位进行截取
- -c 以字符为单位进行截取
- –complement 排除所指定的字段
- –output-delimiter 更改输出内容的分隔符
[root@localhost tr]# cut -d ':' -f 1-3 /etc/passwd #已":"作为分隔符,指定第一个到第三个字段进行输出
[root@localhost ~]# head -n 2 /etc/passwd|cut -d ':' --complement -f 2 #指定已":"作为分隔符,但是删除了第二个字段进行输出
[root@localhost ~]# head -n 2 /etc/passwd|cut -d ':' -f 1-5 --output-delimiter='@' #将分隔符转换为@,进行输出
文件拆分——split
split命令用于在Linux下将大文件拆分为若干小文件。
格式:
split 选项 参数 原始文件 拆分后文件名前缀
选项
- -l 指定行数
- -b 指定文件的大小
[root@localhost opt]# cp /etc/passwd /opt/test2.txt
[root@localhost tr]# split -l 20 test2.txt sc
[root@localhost opt]# split -b 2m httpd-2.4.29.tar.bz2 sc 指定文件大小,不需要大小写
文件合并——paste
按照字段来进行文件的合并
格式:
paste [选项] 文件1 文件2
选项
- -d 用于指定文件的分隔符(默认情况下为制表符"\n")
- -s 将列和行的内容进行互相交换
- paste a b和cat a b 之间的区别 (左右合并)
sed编辑器的介绍
sed 即 Stream EDitor,和 vim 不同,sed是行编辑器
sed命令格式与选项操作符
基本操作格式:
sed -e '操作' 文件1 文件2
sed -e '操作' 文件1 文件2
sed -f 脚本文件 文件1 文件2
sed -i -e '操作' 文件1 文件2
执行多条命令的格式:
方式一:
sed -e '操作1' -e '操作2' 文件
sed -n -e '/^r/p' -e '/^b/p' /etc/passwd
方式二:
sed -e '操作1;操作2' 文件
sed命令的常用选项
- -e 或–expression=:表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
- -f 或–file=:表示用指定的脚本文件来处理输入的文本文件。
- -h 或–help:显示帮助。
- -i 直接修改目标文本文件 慎用
- -n 仅显示script处理后的结果
sed命令的操作符
- s:替换,替换指定字符。
- d:删除,删除选定的行。
- a:增加,在当前行下面插入一行指定内容。
- i:插入,在选定行上面插入一行指定内容。
- c:替换,将选定行替换为指定内容。
- y:字符转换,转换前后的字符长度必须相同。
- p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
- =:打印行号。
- l(小写L):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
- r:扩展正则表达式
sed命令的打印功能
[root@localhost opt]# sed ''
[root@localhost ~]#sed '' /etc/fstab #查看文件内容
[root@localhost opt]# sed '' < /etc/fstab #可以支持重定向输入
[root@localhost opt]# cat /etc/passwd |sed '' #也可以支持管道符
默认打印方式:
[root@www rh]# sed -e 'p' test1.txt --sed有一个默认输出,加上P,会打印两行
123
123
345
345
789
789
000
000
[root@www rh]# sed -n 'p' test1.txt -- -n禁止了默认输出,就只有一行
123
345
789
000
[root@localhost opt]# ifconfig ens33|sed -n 2p #打印第二行
inet 192.168.233.21 netmask 255.255.255.0 broadcast 192.168.233.255
打印时对行号的操作
[root@localhost sed]#sed -n '=' test1.txt ---只显示行号
[root@localhost sed]#sed -n '=;p' test1.txt ---显示行号和每行的内容
sed命令的寻址打印:
方式一:按照行号寻求内容
[root@localhost sed]#sed -n '1p' test1.txt --打印第一行
[root@localhost sed]#sed -n '4p' test1.txt --打印第四行
[root@localhost sed]#sed -n '$p' test1.txt --打印最后一行
方式二:进行行号范围区间的打印
[root@localhost sed]#sed -n '1,3p' test1.txt --打印1-3行
[root@localhost sed]#sed -n '5,$p' test1.txt --打印第五行到最后一行
[root@localhost sed]#sed -n '2,+2p' test1.txt ---打印第二行+两行的内容,相当于2,4p
[root@localhost opt]#sed -n '3p;5p' test1.txt ---输出第三行和第五行
方式三:指定间隔打印
[root@localhost sed]#sed -n -e '2p' -e'$p' test1.txt ---打印第二行和最后一行
[root@localhost sed]#sed -n -e '2p' -e'3p' test1.txt ---打印第二行和第三行
方式四:对奇数行和偶数行的打印
[root@localhost sed]#sed -n 'n;p' test1.txt ---打印偶数的行
[root@localhost sed]#sed -n 'p;n' test1.txt ---打印奇数的行
n在p前面,跳过一行,打印下一行,就是偶数行;在后面,就是打印第一行,然后跳过一行,形成奇数行
文本模式过滤行内容
方式一:对包含的字符串进行过滤打印
[root@localhost sed]#sed -n '/o/p' test1.txt ---包含o的所有行
[root@localhost sed]#sed -n '/th/p' test1.txt ---包含th的所有行
方式二:应用基础正则表达式进行打印
[root@localhost sed]#sed -n '/^root/p' /etc/passwd --以root为开头的所有内容,全文本搜索
[root@localhost sed]#sed -n '/bash$/p' /etc/passwd --以bash结尾的所有内容,全文本搜索
[root@localhost sed]#sed -n '4,/bash$/p' /etc/passwd --从第四行开始,一直打印到第一个以bash为结尾的所在行
方式三:使用扩展正则表达式进行打印
注意:
sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\ 。
[root@localhost sed]# sed -r -n '/(99:){2,}/p' /etc/passwd ---包含有两个99:的内容所在行
[root@localhost sed]# sed -r -n '/^root|bash$/p' /etc/passwd ---包换以root开头,或者以bsah结尾的内容所在行
sed的删除操作:
sed -i 时会对文本进行实际操作(建议对目标文件先进行备份,再进行操作)
通过行号进行删除
[root@localhost sed]#sed 'd' test1.txt ---删除所有,什么也不打印
[root@localhost sed]#sed -n '3d;p' test1.txt ---删除第三行,打印剩余的所有内容
[root@localhost sed]#sed -n '5,8d;p' test1.txt ---删除5到8行,打印剩余的所有内容
[root@localhost sed]#sed -n '5,$d;p' test1.txt ---删除5到最后一行行,打印剩余的所有内容
[root@localhost sed]#sed '4,6!d' test1.txt ---除了4-6行,其他的全部删除
如果要生效:sed -i -n
匹配字符串内容删除
[root@localhost sed]#sed '/one/d' test1.txt ---删除包含one的行
[root@localhost sed]#sed '/one/,/six/d' test1.txt ---删除one-six的行
[root@localhost sed]#sed '/one/,/six/!d' test1.txt ---除了one-six的行,其余的全部删除,反向删除
[root@localhost sed]#sed '/six/!d' test1.txt ---除了six的行,其余的全部删除,反向删除
字符串搭配正则进行删除:
[root@localhost sed]#sed '/^$/d' test1.txt ---通过^$,来删除空行;
删除空行的三种方法:
grep -v "^$" test1.txt ----过滤出非空行
cat test1.txt |tr -s "\n" ----压缩换行符
sed '/^$/d' test1.txt ----删除空行
sed命令替换:
格式:
行范围 s/旧字符串/新字符串/替换标记
替换标记:
- 数字:表明新字符串将替换第几处匹配的地方
- g:表面新字符串将会替换所有匹配的地方
- p:打印与替换命令匹配的行,与-n一起使用
- w文件:将替换的结果写入文件中
sed命令的替换中:
- s:替换字符串
- c:整行替换
- y:字符替换,替换前后的字符串长度必须相同
[root@localhost sed]#sed -n 's/root/test/2p' /etc/passwd --指定第二个root,替换为了test
[root@localhost sed]#sed -n 's/root/test/gp' /etc/passwd --所有的root都替换为test
[root@localhost sed]#sed -n '/^root/ s/^/#/p' /etc/passwd --以root开头开始处理,把开头为空的替换为#,注释掉
字母字符进行大小写的替换:
[root@localhost sed]#sed 's/[A-Z]/\l&/g' test1.txt ---将大写全部转换为小写,
l&是转换小写的一种特殊的符号,前面要加转义符“\”
[root@localhost sed]#sed 's/[a-z]/\u&/' test1.txt ---把首字母替换成大写,
u&是转换首字母大写的一种特殊的符号,前面要加转义符“\”
[root@localhost sed]#sed 's/[a-z]/\U&/g' test1.txt ---末尾加上了一个g,全部转换成大写
整行替换:
[root@localhost sed]# sed '/ONE/c 22' test1.txt
[root@localhost sed]# sed '/TWO/c TEST' test1.txt
在文章中找到/var/www/cgi-bin并把它改为/etc:
sed 's///g'➡sed 's//var/www/cgi-bin//etc/g'➡sed 's/\/var\/www\/cgi-bin/\/etc/g' 文件名
第二种方法:sed 's|||g'➡sed 's|/var/www/cgi-bin|/etc|g' 文件名
单字符的替换
使用y,是对单个字符进行替换,每个字符需要一一对应,不是整体替换。前后字符串长度需要一致,不然会报错
只要有匹配的单字符会全部替换
[root@localhost sed]# sed 'y/TH/12/' test1.txt
sed命令的增加:
a:在下一行添加内容
i:在上一行插入内容
r:在行后读入文件内容
[root@localhost sed]# sed '/three/a 123' test1.txt #行后
[root@localhost sed]# sed '/three/i 123' test1.txt #上一行
[root@test1 opt]# sed '/three/r test.sh' 123.txt #当前行的下一行
[root@localhost sed]# sed '$r test2.txt' test1.txt ---先读取test1内容,然后再test2的末行插入test2的所有内容
[root@localhost opt]# sed '$a 123' 123.txt #在123.txt的文件最后一行插入123
oneoneone
oneoneone
twotwotwo
oneoneone
twotwotwo
oneoneone
twotwotwo
123
[root@localhost opt]# sed '$i 123' 123.txt #在123.txt的文件最后后面的行中插入123
oneoneone
oneoneone
twotwotwo
oneoneone
twotwotwo
oneoneone
123
twotwotwo
sed命令中字符串和字符的位置交换
[root@localhost opt]# echo ky29ztt | sed -r 's/(ky29)(ztt)/\2\1/'
yhtky27
[root@localhost opt]# echo ky27yhtdxl | sed -r 's/(ky27)(yht)(dxl)/\3\2\1/'
dxlyhtky27
[root@localhost opt]# echo ky27yhtdxl | sed -r 's/(ky27)(yht)(dxl)/\2\1/'
yhtky27
[root@localhost opt]# echo ky27yhtdxl | sed -r 's/(ky27)(yht)(dxl)/\3\1/'
dxlky27
[root@localhost opt]# echo ky27yhtdxl | sed -r 's/(ky27)(yht)(dxl)/\3\2/'
dxlyht
[root@localhost sed]#echo 123abc|sed -r 's/(.)(.)(.)(.)(.)(.)/\6\5\4\3\2\1/' #前面的点表示字符位置,后面的数字表示对应的交换顺序
[root@localhost opt]# echo 张涛涛真的帅 | sed -r 's/(.)(.)(.)(.)(.)(.)/\6\5\4\3\2\1/'
帅的真涛涛张
sed -f 指定命令来对第二个文件的行进行处理。
[root@localhost opt]# cat 123.txt
/IPADDR=192.168.233.21/c IPADDR=10.10.10.10
[root@localhost opt]# cat 456.txt
IPADDR=192.168.233.21
[root@localhost opt]# sed -f 123.txt 456.txt
IPADDR=10.10.10.10
[root@localhost opt]# cat ky27.txt
s/ /_/g
[root@localhost opt]# cat ky27sed.txt
hello world
yht dxl
[root@localhost opt]# sed -f ky27.txt ky27sed.txt
hello_world
yht_dxl
[:space:] ↩︎