1. 正则匹配转义

  1. 作为正常字符时需要转义:[]

  2. 作为特殊字符时需要转移:{}()+,不需要转义:*

2. 命令

参数说明:

-e<script>或—​expression=<script> 以选项中指定的script来处理输入的文本文件。 -f<script文件>或—​file=<script文件> 以选项中指定的script文件来处理输入的文本文件。 -h或—​help 显示帮助。 -n或—​quiet或—​silent 仅显示script处理后的结果。 -V或—​version 显示版本信息。

动作说明:

a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行); c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行; d :删除 i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行); p :打印,通常 p 会与参数 sed -n 一起运行 s :取代,这个 s 的动作可以搭配正则表达式

3. 示例

3.1. 追加删除

# sample.txt文件第4行后面追加一行
sed -e '4a hello' sample.txt

# sample.txt文件第1行前面添加“hello”;实质就是插入内容到文件第1行
sed -i '1 i hello' sample.txt

# sample.txt文件第1行后面添加“hello”;实质就是插入内容到文件第2行
sed -i '1 a hello' sample.txt

# 把"hello"插入到最后一行
sed -i '$a hello' sample.txt

# 在1-2行行首添加bb
sed -i '1,2{s/^/bb/}' sample.txt

# 在1-2行行尾添加bb
sed -i '1,2{s/$/bb/}' sample.txt
将第 2~5 行删除
nl aaa.txt | sed '2,5d'
将文件中包含 字符串1 的行删除
sed -i "/字符串1/d" 文件名.txt

#包含 字符串1 或 字符串2的行删除
sed -i "/字符串1\|字符串2/d" 文件名.txt

#删除以R或F开头的行
sed '/^[RF]/d' 文件名.txt

#删除以 x 或 m 结尾的行
sed '/[xm]$/d' 文件名.txt
删除空白行
sed '/^$/d' 文件名.txt

3.2. 查找替换

# 加 g 为全局查找替换
sed 's/要被取代的字串/新的字串/g'

# 不加则为每行第一次出现的替换
sed 's/要被取代的字串/新的字串/'

# 参数 e 则输出修改后内容,不修改原文件
sed -e 's/要被取代的字串/新的字串/g' aaa.txt

# 参数 i 直接修改原文件,不输出结果
sed -i 's/要被取代的字串/新的字串/g' aaa.txt

# 多个文件批量修改
sed -i 's/要被取代的字串/新的字串/g' *.txt

# 如果替换的内容有/,可以将分隔符改为其他的字符,比如#
sed -i 's#要被取代的字串#新的字串#g' *.txt

# 使用变量
#方式1: 使用单引号,变量处使用单引号+双引号把变量包括起来
sed -i 's#要被取代的字串#新的字串'"${a}"'#g' *.txt
#方式2: 使用双引号
sed -i "s#要被取代的字串#新的字串${a}#g" *.txt
#方式3: 使用单引号,变量直接引用,但是需要通过 eval 执行这个sed命令。eval会对后面Shell命令进行两遍扫描,如果第一遍扫描后,Shell命令是个普通命令,则执行此命令;如果Shell命令是含有变量的间接引用,则保证间接引用的语义
eval sed -i 's#要被取代的字串#新的字串${a}#g' *.txt

3.3. 多点编辑

# 删除第3行之后的数据,同时对行数据进行替换
nl aaa.txt | sed -e '3,$d' -e 's/要被取代的字串/新的字串/'

3.4. 搜索并执行命令,多个命令花括号包含起来

# 搜素,然后替换打印后退出
nl aaa.txt | sed -n '/搜索关键字/{s/要被取代的字串/新的字串/;p;q}'