sed编辑器
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。
sed 的工作流程主要包括读取、执行和显示三个过程:
•读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
•执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行。
•显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
命令格式:
方式一:sed -e '操作' 文件1 文件2
方式二:sed -n -e '操作' 文件1 文件2 ....
方式三:sed -f 脚本文件 文件1 文件2......
方式四:sed -i -e '操作' 文件1 文件2 ....
方式五:sed -e 'n{
操作1
操作2
...
}' 文件1 文件2 ......
-e | 或--expression=:表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令适用 |
-f | 或--file=:表示用指定的脚本文件来处理输入的文本文件 |
-h | 或-- help:显示帮助 |
-n | --quiet或silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出 |
-i | 直接修改目标文本文件 |
s:替换,替换指定字符
d:删除,删除选定的行
a:增加,在当前行下面增加一行指定内容
i:插入,在选定行上面插入一行指定内容
c:替换,将选定行替换为指定内容
y:字符转换,转换前后的字符长度必须相同
p:打印,如果同时指定行,表示打印指定行,如果不指定行,则表示打印所有内容:如果由非打印字符,则以ASCII码输出。其通常与“-n”选项一起适用
=:打印行号
l(小写L);打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
[root@cx ~]# cat test
one
two
three
four
five
six
seven
night
nine
ten
eleven
twelve
[root@cx ~]# cat test | sed -n 'p' #不显示,只打印内容
one
two
three
four
five
six
seven
night
nine
ten
eleven
twelve
[root@cx ~]# cat test | sed -n '=' #打印行号
1
2
3
4
5
6
7
8
9
10
11
12
[root@cx ~]# cat test |sed -n '=' | tail -1 #打印最后一个行号
12
[root@cx ~]# cat test | wc -l #统计行数
12
[root@cx ~]# cat test |sed -n -e 'p' -e '=' #执行两个命令需要加-e
one
1
two
2
three
3
four
4
five
5
six
6
seven
7
night
8
nine
9
ten
10
eleven
11
twelve
12
[root@cx ~]#
[root@cx ~]# cat test |sed -n '=;p' #或者分号表示
删除格式:
sed '行号d' 删除指定行号的行
sed '行1,行2d' 删除行1与行2区间的行
sed '/字符串/d' 删除包含字符串的行
sed '/正则表达式/d' 删除所有包含正则表达式能匹配到的内容的行
sed '/字符串1/,/字符串2/d'从第一个包含字符串1的行开始删除到从第一个包含字符串2的行,之后重复规则操作到结束
替换格式:
sed 's/旧字符串/新字符串/' 替换匹配行的第一个字符串
sed 's/旧字符串/新字符串/2' 替换匹配行的第二个字符串
sed 's/旧字符串/新字符串/g' 替换匹配行的所有字符串
sed 's/旧字符串/新字符串/gw file' 替换匹配行的所有字符串并保存到file
sed '/字符串/ s/旧字符串/新字符串/g'
替换分隔符可以用其他字符代替,要确保分隔符一致
插入格式:
sed '行号 a XXX' 在指定行下面插入内容
sed '/字符串/a XXX'
sed '行号i XXX' 在指定行上面插入内容
sed '/字符串/i XXX'sed '行号 c XXX' 替换指定行的所有行内容
sed 'y/abc/123' 替换所有对应字符
sed '行号 r file' 在指定行下面读取文件file
补充
sed '1,2H;3,4G' 将1,2行内容复制到3和4行下面
sed '/字符串/ {H,d};$G' 将包括字符串的行剪切到末尾
echo 'ABCD' | sed -r 's/^(.)(.*)(.)$/\3\2\1/'
得到DBCA