一. sed编辑器介绍
sed编辑器被称为流编辑器,sed编辑器根据命令来处理数据流中的数据,命令要么从命令行输入,要么存于文本中。
- 一次读取一行数据
- 根据编辑器命令匹配数据
- 按照命令修改流中的数据
- 新的数据输出到STDOUT
二、sed 命令选项
-e | 将指定的命令添加到已有的命令中 |
---|---|
-f | 将file中指定的命令添加到已有的命令中 |
-n | 不产生命令输出,用print命令完成输出 |
三、 常用命令示例
*sed编辑器不会修改文本文件的数据,只会将修改后的数据发送到STDOUT
-
echo "this is a test" | sed 's/test/big test/'
解释: s – 替换命令 -
sed -e 's/a/b/; s/c/d/' file.txt
解释: -e – 执行多个命令,命令之间用分号隔开,命令末尾和分号之间不可有空格 -
sed -f script1.sed file.txt
解释:-f – 从文本中读取命令,文本中每行格式(s/a/b/) -
更多的替换选项
默认情况下s只替换每行出现的第一处,替换标记可以解决
数字 | 表明新文本将替换第几处模式匹配的地方 |
---|---|
g | 替换所有匹配的文本 |
p | 表明原先行的内容要打印出来 |
w | 将替换结果写入到文件中 |
sed 's/test/xxxx/2' data.txt # 替换每行第二次模式匹配的地方
sed 's/a/b/g' data.txt
sed -n 's/a/b/p' data.txt (只输出被替换命令的修改行)
特殊处理
sed 's/\/bin\/bash/\/bin\/ksh/' /etc/passwd # 转义字符
or(! 替换sed的分隔符)
sed 's!/bin/bash!/bin/ksh!' /etc/passwd
- 数字方式的行寻址
sed '2s/a/b/' data.txt
sed '2,3s/a/b/' data.txt
sed '2,$s/a/b/' data.txt # 从第二行开始到最后一行的所有行
- 使用文本模式过滤器
sed '/findtxt/s/a/b/' data.txt (一般使用正则表达式)
- 命令组合-{}
sed '2{s/a/b/; s/c/d/}' data.txt (单行多条命令) # 类似 -e 命令
sed '3,${s/a/b/; s/c/d/}' data.txt
- 删除行
使用命令时要特别小心,如果未加寻址模式,则流中的所有文本行都会被删除。
sed 'd' data1.txt (删除data1中的内容)
sed '3d' data1.txt (仅删除第三行)
sed '2,3d' data1.txt (删除2,3行内容)
sed '2,$d' data1.txt (删除第二行到末尾的行)
sed '/number1/d' data1.txt (删除匹配number1行的内容)
/*使用两个文本模式删除行要特别小心,第一个模式打开删除功能,第二个模式关闭删除功能,但是因为只要匹配了第一个模式,删除功能就会打开,若没匹配到第二个模式则会一直删*/
sed '/1/,/3/d' data1.txt
- 插入和附加文本
i – 在指定的行前增加一个新行
a – 在指定的行后增加一个新行
echo "test line 2" | sed 'i\test line 1' (注意是反斜杠)
echo "test line 2" | sed 'a\test line 1'
//增加寻址
sed '3i\this is an inserted line.' data1.txt
sed '3a\this is an appended line.' data1.txt
sed '$a\this is a new line of text' data1.txt
sed '1i\line 1\nline 2\n line 3' data1.txt (插入多行使用\n)
- 修改行
c – 命令允许修改数据流中整行文本行的内容
sed '3c\this is a changed line of test.' data1.txt
sed '/number 3/c\this is a changed line of text.' data1.txt (匹配模式会匹配所有符合条件的行)
sed '2,3c\this is a new line.' data1.txt (将两行修改为1行)
- 转换命令
唯一可以处理单个字符的sed编辑器命令,且命令为全局命令,无法限定只转换特定地方出现的字符
sed 'y/123/456/' data1.txt (将123一一映射为456并进行替换)
echo "this 1 is a test of 1 try." | sed 'y/12/34/'
:this 2 is a test of 2 try.
- 回顾打印
p | 打印文本行 |
---|---|
= | 打印行号 |
l(小写L) | 列出行 |
打印行
echo "test line" | sed 'p'
:test line
:test line
sed '/number 3/p' data1.txt
:this is line number 3
sed -n '2,3p' data1.txt
:this is line number 2
:this is line number 3
sed -n '/3/{p; s/line/test/p}' data1.txt
:this is line number 3
:this is test number 3
打印行号
sed '=' data1.txt
:1
:this is line number 1
:2
:this is line number 2
sed -n '/number 4/{=; p}' data1.txt
:4
:this is line number 4
列出行
可以打印数据流中的文本和不可打印的ASCII字符
cat data1.txt
:this line contains tabs.
sed -n 'l' data1.txt
this\tline\tcontains\ttabs.$
13.用sed处理文件
写入文件
sed '1,2w infile.txt' data1.txt
cat infile.txt
:this is line number 1
:this is line number 2
sed -n '/number1/w infile.txt' data1.txt (sed只会将包含文本格式的数据行写入文件)
cat infile.txt
:this is line number1
从文件读取数据
cat file.txt
:aaa
:bbb
sed '1r file.txt' data1.txt (将file.txt中的内容插入到第一行后)
:this is line number 1
:aaa
:bbb
sed '/number 2/r fil.txt' data1.txt
sed '$r file.txt' data1.txt
使用占位符
sed '/LIST/{r file.txt; d}' notice.std (占位文本已经替换为数据文件中的名单)