sed命令使用
简介
sed
是一种流式文本编辑工具,在 Linux 系统中被广泛使用。它运行在终端中,能够对文本进行替换、删除、插入、取代等操作。
sed对文本的处理很强大,并且sed非常小,参数少,容易掌握,他的操作方式根awk有点像。sed按顺序逐行读取文件。
然后,它执行为该行指定的所有操作,并在完成请求的修改之后的内容显示出来,也可以存放到文件中。完成了一行上的所有操作之后,它读取文件的下一行,然后重复该过程直到它完成该文件。
在这里要注意一点,源文件(默认地)保持不被修改
。sed 默认读取整个文件并对其中的每一行进行修改。说白了就是一行一行的操作。
命令
sed -h
-n, --quiet, --silent 取消自动打印模式空间
-e 脚本, --expression=脚本 添加“脚本”到程序的运行列表
-f 脚本文件, --file=脚本文件 添加“脚本文件”到程序的运行列表
--follow-symlinks 直接修改文件时跟随软链接
-i[扩展名], --in-place[=扩展名] 直接修改文件(如果指定扩展名就备份文件)
-l N, --line-length=N 指定“l”命令的换行期望长度
--posix 关闭所有 GNU 扩展
-r, --regexp-extended 在脚本中使用扩展正则表达式
-s, --separate 将输入文件视为各个独立的文件而不是一个长的连续输入
-u, --unbuffered 从输入文件读取最少的数据,更频繁的刷新输出
--help 打印帮助并退出
--version 输出版本信息并退出
-a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
-c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
-d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
-i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
-p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
-s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法
案例
下面的案例使用如下文本进行演示:
old:case:bash
old1:graph:
old2:code:shell
old3:print:mail
dewy:year:text
替换
将文件
file.txt
中的old
替换为new
。sed 's/old/new/' file.txt
如果需要替换所有的字符串,需要添加
g
参数:sed 's/old/new/g' file.txt
如果需要查看哪些行发生了变化,可以添加
-n
和p
参数:sed -n 's/old/new/gp' file.txt
指定替换范围,如果需要替换前2到3行范围内的文本:
sed -n '2,3s/old/new/gp' file.txt
如果不同的范围需要替换不同的内容,可以参考:
sed -n '2,3s/old/new1/gp;4s/old/new2/gp' file.txt
2,3行之间的old使用new1替换,第4行的old使用new2替换。
;
用于分割两个命令。关于命令的分割,可以使用-e参数:
sed -ne '2,3s/old/new1/gp' -ne '4s/old/new2/gp' file.txt
如果不知道要替换的范围,但是直到开始和结束的字符串。比如从old1开始到old2之间的文本需要替换。
sed -ne '/^old1/,/old2/s/old/new/gp' file.txt
使用正则替换时,特殊符号要进行转义:
sed -n 's/^\(ol\w\{1\}\)/new/gp' file.txt
这里匹配ol字符后有一个字符的文本替换为new
&
用于在匹配的文本后,附加文本sed 's/old/&new/' file.txt
上面的命令会在匹配到
old
的文本后面添加new
n;
是next的缩写,sed '/old/{n;s/old1/new1/}' file.txt
上面的命令会在匹配到old的文本之后,将下一行的old1替换为new1
y的作用是进行字符集替换,不过替换字符和被替换字符长度要一样
sed 'y/old/new/' file.txt
该命令会将所有的o替换为n,l替换为e,d替换为w。这个命令与s是不同的,需要注意。
h的作用是将找到的行,放到一个缓存区,G的作用是将缓存区中的内容放到最后一行
sed '/old1/h;$G' file.txt
该命令会见匹配到old1所在的行放到缓存区,$G会将该内容放到最后一行。
行替换,用匹配old1的行,来替换匹配old2的行
sed '/old1/h;/old2/g' file.txt
退出
q
sed 's/old/new/g;3q' file.txt
3q的意思为匹配到第3行退出
特殊匹配,以下文本表示符合某种规则
匹配数字别忘了中括号外面还有一个中括号。
[:alnum:] 字母数字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或制表键
[:cntrl:] 任何控制字符
[:digit:] 数字 [0-9]
[:graph:] 任何可视字符(无空格)
[:lower:] 小写 [a-z]
[:print:] 非控制字符
[:punct:] 标点字符
[:space:] 空格
[:upper:] 大写 [A-Z]
[:xdigit:] 十六进制数字 [0-9 a-f A-F]
使用方法如:
sed -n 's/[[:digit:]]/xxx/gp' file.txt
该命令将所有的数字替换为xxx
删除
删除行:
sed '/old/d' file.txt
删除文件
file.txt
中包含old
的所有行。删除1到3行
sed '1,3d' file.txt
删除3行之后的所有
sed '3,$d' file.txt
删除包括old1的行,或者包括old2的行,别忘了加\
sed '/\(old1\|old2\)/d' file.txt
字符匹配范围删除
sed '/old1/,/^old3/d' file.txt
从old1开始到old3开头的数据
插入
插入行:
sed '3idewy yr' file.txt
在文件
file.txt
的第 3 行之前插入dewy yr
。在匹配行后添加一行:
sed '/old/a new_line' file.txt
在文件
file.txt
中包含old
的所有行后添加一行new_line
。读取test2的内容,并将其写入到匹配行的下面
sed '/^old/r test2' file.txt
将匹配的内容写入test2中
sed '/old/w test2' file.txt