目录
- sed编辑器
- sed命令格式及参数选项
- 使用
- 替换、插入与删除
- 打印
- 文件IO
- 退出
sed编辑器
sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。
在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式地插入、删除或替换数据中的文本。
流编辑器则会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器执行操作过程
(1)一次从输入中读取一行数据
(2)根据所提供的编辑器命令匹配数据
(3)按照命令修改流中的数据
(4)将新的数据输出到STDOUT
在流编辑器将所有命令与一行数据匹配完毕后,会读取下一行数据并重复这个过程。当处理完流中所有数据行后,就会终止。
sed命令格式及参数选项
使用
sed [选项] [脚本命令] 文件名
首先创建一个test.txt文件,并且拷贝一份
$ cat test.txt
This is a test of the test script.
This is the second test of the test script.
替换与删除
sed s替换命令基本格式
[address]s/pattern/replacement/flags
其中,address 表示指定要操作的具体行,s表示替换substitute,pattern 指的是需要替换的内容,replacement 指的是要替换的新内容。
flags标记及其功能
n:1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 C,但用户只想替换第二个 C,这是就用到这个标记;
g:对数据中所有匹配到的内容进行替换,如果没有 g,则只会在第一次匹配成功时做替换操作。例如,一行数据中有 3 个 C,则只会替换第一个 C;
p:会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用;
w file:将缓冲区中的内容写到指定的 file 文件中;
&:用正则表达式匹配的内容进行替换;
\n:匹配第 n 个子串,该子串之前在 pattern 中用 () 指定;
\:转义(转义替换部分包含:&、\ 等)。
替换时指定新文本替换第几处模式匹配的地方
指定每行第2个匹配替换
sed 's/test/trial/2' test.txt
替换所有匹配的字符串flags为g
sed 's/test/trial/g' test.txt
我们知道,-n选项会禁止sed输出,但p标记会输出修改过的行,将二者匹配使用的效果就是只输出被替换命令修改过的行
sed -n 's/test/trial/p' test1.txt
$ cat test1.txt
This is a test line.
This is a different line.
w 标记会将匹配后的结果保存到指定文件中
sed 's/test/trial/w test_out.txt' test.txt
在使用 s 脚本命令时,替换类似文件路径的字符串会比较麻烦,需要将路径中的正斜线进行转义(前面加反斜杠)
sed 's/\/bin\/bash/\/bin\/csh/' test2.txt
$ cat test2.txt
qiuyinbin:/home/qiuyinbin:/bin/bash
结合-f参数
sed -f从文件中读取编辑器命令
$ cat script.txt
s/brown/green/
s/fox/elephant/
s/dog/cat/
$ cat test5.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
sed -f script.sed test5.txt
sed d 替换脚本命令
[address]d
如果需要删除文本中的特定行,可以用 d 脚本命令,它会删除指定行中的所有内容。但使用该命令时要特别小心,如果你忘记指定具体行的话,文件中的所有内容都会被删除
sed 'd' test3.txt
表明所有行都被删除
$ cat test3.txt
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
The quick brown fox jumps over the lazy dog
address使用的几个简单的例子:
通过行号指定,如删除文件第三行
sed '3d' test4.txt
$ cat test4.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
通过特定行区间指定,如删除第2、3行
sed '2,3d' test4.txt
使用两个文本模式来删除某个区间内的行,但这么做时要小心,你指定的第一个模式会“打开”行删除功能,第二个模式会“关闭”行删除功能,因此,sed 会删除两个指定行之间的所有行(包括指定的行)
如删除第 1~3 行的文本数据
sed '/1/,/3/d' test4.txt
或者通过特殊的文件结尾字符,比如删除test4.txt 文件内容中第3行开始的所有的内容
sed '3,$d' test4.txt
sed a 和 i 脚本命令
a 命令表示在指定行的后面附加一行,i 命令表示在指定行的前面插入一行,这里之所以要同时介绍这 2 个脚本命令,因为它们的基本格式完全相同
[address]a(或i)\新文本内容
在第三行前插入行
sed '3i\This is an inserted line.' test4.txt
在第三行后插入一行
sed '3a\This is an inserted line.' test4.txt
如果你想将一个多行数据添加到数据流中,只需对要插入或附加的文本中的每一行末尾(除最后一行)添加反斜线即可(这里是第一行前插入)
sed '1i\This is one line of new text.\
This is another line of new text.' test4.txt
sed c 替换脚本命令
c 命令表示将指定行中的所有内容,替换成该选项后面的字符串。
[address]c\用于替换的新文本
替换文件test4.txt第3行内容为This is a changed line of text.
sed '3c\This is a changed line of text.' test4.txt
sed y 转换脚本命令
[address]y/inchars/outchars/
转换命令会对 inchars 和 outchars 值进行一对一的映射,即 inchars 中的第一个字符会被转换为 outchars 中的第一个字符,第二个字符会被转换成 outchars 中的第二个字符...这个映射过程会一直持续到处理完指定字符。如果 inchars 和 outchars 的长度不同,则 sed 会产生一条错误消息。
sed 'y/123/789/' test4.txt
sed r 脚本命令
r 命令用于将一个独立文件的数据插入到当前数据流的指定位置
[address]r filename
sed 命令会将 filename 文件中的内容插入到 address 指定行的后面
sed '2r test.txt' test4.txt
sed p 打印脚本命令
p 命令表示搜索符号条件的行,并输出该行的内容
[address]p
p 命令常见的用法是打印包含匹配文本模式的行
sed -n '/number 3/p' test4.txt
如果需要在修改之前查看行,也可以使用打印命令,比如与替换或修改命令一起使用。可以创建一个脚本在修改行之前显示该行
sed -n '/3/{
p
s/line/test/p
}' test4.txt
sed 命令会查找包含数字 3 的行,然后执行两条命令。首先,脚本用 p 命令来打印出原始行;然后它用 s 命令替换文本,并用 p 标记打印出替换结果。输出同时显示了原来的行文本和新的行文本。
sed w 脚本命令
w 命令用来将文本中指定行的内容写入文件中
[address]w filename
这里的 filename 表示文件名,可以使用相对路径或绝对路径,但不管是哪种,运行 sed 命令的用户都必须有文件的写权限。
sed '1,2w test6.txt' test4.txt
加上-n选项不会输出原始文件的行
sed -n '1,2w test6.txt' test4.txt
sed q 退出脚本命令
q命令的作用是使 sed 命令在第一次匹配任务结束后,退出 sed 程序,不再进行对后续数据的处理。
sed '2q' test4.txt
找到number 1之后执行{}中的操作,然后直接退出
sed '/number 1/{ s/number 1/number 0/;q; }' test4.txt
参考
C语言中文网http://c.biancheng.net/view/4028.html
书籍《Linux命令行与shell脚本编程大全》