sed 命令是流编辑器的缩写,对输入执行基本的文本转换。
sed 命令的一大好处是您可以在文件中的任何位置添加文本 。
sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。
语法:
sed -i '$ a\ 添加的文本' 文件名称
# "-i" :告诉系统它将使用相关文件来插入文本
# "$" :该行将添加到文件末尾
# 文本前面添加 "a" 告诉系统我们希望将该行附加到文件的现有内容中。
选项:
-e<script>或--expression=<script> :它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
-f<script文件>或--file=<script文件>:后跟保存了sed指令的文件, 以选项中指定的script文件来处理输入的文本文件。
-h或--help :显示帮助。
-n或--quiet或--silent: 取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-r:支持扩展正则
动作说明:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d :删除,因为是删除啊,所以 d 后面通常不接任何东西;
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :取代,可以直接进行取代的工作!通常这个 s 的动作可以搭配正则表达式!例如 1,20s/old/new/g
示例:
-p:打印文本
#打印第3行
sed -n '3p' /etc/passwd
#打印第5-10行
sed -n '5,10p' /etc/passwd
#显示第1行和第5行
sed -n '1p;5p' /etc/passwd
#打印:取反,取1到4行
cat -n /etc/passwd|sed -n '5,100!p'
#显示第2行和其后面两行:即显示2-4行
sed -n '2,+2p' /etc/passwd
#从第一行起,每间隔3行输出一行:1-4-7-10-13...
sed -n '1~3p' /etc/passwd
-s:取代
#在每行前面加上 *
sed -n 's/^/*/p' a
#在每行末尾加上 ?
sed -n 's/$/?/p' a
#在2-6行前面加上 #
sed -n '2,6s/^/#/p' a
-c:更改整行操作可以根据行号和模式匹配进行操作
语法:
sed '/字符串/c 更换后的字符串' 文件名称
#把第三行改成:"这是c参数"
sed '3c "这是c参数" ' a
#将 a 所在的行,整行替换成后面的字符串(更换了a字符)
sed '/a/c 更换了a字符' a
-a:追加操作可以根据行号和模式匹配进行操作
#在第1行下,新起一行追加后面的字符串
sed '1a 追加的字符串' a
#在第1-3行下,新起一行追加后面的字符串
sed '1,3a 追加的字符串' a
#取代第四行
#在包含 q 的行下面,追加字符串
sed '/q/a 追加的字符串' /etc/fstab
-i:插入操作可以根据行号和模式匹配进行操作
#在文件末尾添加一行
sed -i '$ a 你好!' a
#在第四行后,新起一行追加字符串
sed -i '4 a 这是插入的文本' a
#在第四行后,新起一行追加字符串
sed -e 4a\newLine a
#将a.txt的第88行插入文件b.txt
sed -i '88 r b.txt' a.txt
awk '1;NR==88{system("cat b.txt")}' a.txt > a.txt
-d:删除操作可以根据行号和模式匹配进行操作
#删除1-5行
sed '1,5d' a
#取反,删除除了删除1-5行之外的行
sed '1,5!d' a
#删除包含有'name'字符串的行
sed '/namae/d' a
#删除空行和注释:'^$'空行;'^#'注释
sed -r '/^$|^#/d' a
sed -e '/^$/d' -e '/^#/d' a
sed -r '/^$/d;/^#/d' a
-s:替换
#替换全文每一行的每一个 A 为 B
sed 's/A/B/g' a.txt
#在a文件中,1-5行:把所有 A 替换为 B
sed '1,5s/A/B/g' a.txt
#.* :替换整行
sed '1,5s/.*/B/g' a.txt
#【. :替换一个字符 】把1-5行每个字符替换为 B
sed '1,5s/./B/g' a.txt
#每一行的第一个 w 替换为 W
sed 's/w/W/' a.txt
-y罗列置换每个对应的字符
不同于上面的s命令,以字符串或模式为单位替换为一个整体。
sed 'y/查找的各个字符/对应替换后的各个字符/' 文件名
sed ‘y/abc/123’ test.txt ,这个命令会依次替换a,b,c为1,2,3
查找的各个字符与对应替换后的各个字符的长度要一致 。