sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用。
执行时,把当前要处理的行存储在临时缓冲区中,称为”模式空间“,接着sed命令处理缓存区的内容,处理完后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断的重复,直到文件末尾。
sed主要用来自动编辑一个或者多个文件,简化对文件的反复操作,编写转换程序等。
命令格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
- options 常用选项
- -e 脚本命令 该选项会将其后跟的脚本命令添加到已有的命令;实际就是可以同时执行多条命令。
- -f 脚本命令文件 该选项将其后文件中的脚本命令添加的已有的命令中
- -n 需要使用print命令来完成输出
- -i 直接修改源文件。
- command 脚本命令
-
s 命令
格式: [address]s/pattern/replacement/flags
其中 address:表示指定要操作的具体行。
pattern:表示需要替换的内容
replacement:表示要替换的新内容
flag:标记
| flags标记 | 功能|flags标记 功能 n 1~512 之间的数字,表示指定要替换的字符串出现第几次时才进行替换,例如,一行中有 3 个 A,但用户只想替换第二个 A,这是就用到这个标记; g 对每一行中所有匹配到的内容进行替换,如果没有 g,则只会在该行第一次匹配成功时做替换操作。例如,一行数据中有 3 个 A,则只会替换第一个 A; p 会打印与替换命令中指定的模式匹配的行。此标记通常与 -n 选项一起使用。 w file 将缓冲区中的内容写到指定的 file 文件中; & 用正则表达式匹配的内容进行替换; \n 匹配第 n 个子串,该子串之前在 pattern 中用 () 指定。 \ 转义(转义 替换部分 包含的:&,\等) -
d 删除命令
-
a 指定行后面添加一行
-
i 指定行前面插入一行
-
c 指定行中的所有内容,替换成该选项后面的字符串
-
y 转换命令可以处理单个字符的sed命令
-
r 将一个独立文件的数据插入到当前数据流的指定位置
-
- file(s)
- file表示要替换的文件
举一反三
- 替换命令s(以下命令不会直接修改替换文件内容)
-
sed ‘s/are/is/g’ data.txt
替换data.txt文件中的所有行中的test为trial; s表示替换命令 g表示匹配所有的行以及每一行中的所有匹配内容 -
sed ‘s/are/is/ data.txt’
替换data.text文件中每一行第一次配合的内容替换。
-
sed -n ‘s/test/trial/p’ data.txt
替换data.txt文件中的test内容为trial,并且只显示替换后的内容,注意n 和 p的配合使用和区别 -
sed ‘s/test/trial/w test.txt’ data.txt
w标记时把匹配后的结果保存在指定文件中。 -
在使用 s 脚本命令时,替换类似文件路径的字符串会比较麻烦,需要将路径中的正斜线进行转义,有两种方法:
第一种是用转义符 -
sed -n ‘s/^home=.*/home=/home/windos/test/p data.txt’
第二种是用#代替s命令中的分割符 -
sed -n ‘s#^home=.*#home=/home/windos/test#p’ data.txt
- sed d 删除命令(以下命令不会修改文件内容)
- sed ‘d’ data.txt
文件中的所有内容都会被删除 - sed ‘3d’ data.txt
删除data文件中的第三行内容 - sed ‘2,3d’ data.txt
删除data文件中第2-3行内容 - sed ‘/1/,/3/d’ data.txt
删除data文件1-3行的内容 - sed ‘3,$d’ data.txt
删除data文件中第3行开始的所有内容
- sed a i 命令
- sed ‘3i\this is sed i command’ data.txt
在第三行前面插入this is sed i command 内容 - sed ‘3a\this is sed i command’ data.txt
在第三行后面添加this is sed i command 内容
- sed c 命令
- sed ‘3c\this is test txt’ data.txt
将data文件中的第三行内容替换为this is test txt
- sed r 命令
- sed ‘3r test.txt’ data.txt
将test.txt文件内容插入到data文件第三行的后面
sed 脚本命令的寻址方式
在sed 命令中address用来表明该脚本命令作用到文本中的具体行
默认情况下,sed命令会作用于文本数据的所有行,如果只想将命令作用于特定行或者某些行,则必须写明addres部分,表示方法有以下2中:
- 以数字形式指定行区间
- 用文本模式指定具体行区间
格式:
[address]脚本命令
adress{
多个脚本命令
}
举一反三
1.以数字形式指定区间
- sed ‘2s/test/cot/’ data.txt
表示将data文件的第2行中的test替换为cot - sed ‘2,3s/test/cot’ data.txt
表示将data文件中的2-3行中test替换为cot
- 用文本模式指定行区间
格式: /pattern/command
sed ‘/home/s/windos/root/’ data.txt
表示找到data文件的home的所在的行将windos替换为root