sed
是一个流式的文本编辑器,就是读取一行处理一行。并不像我们常见的编辑器把整个文件都先读入内存中。所以sed很适合处理大数据文件, 每次读取一行,处理一行。处理的结果可以重定向到其他的文件,或者显示在终端中。sed
的另外的一个特点就是,非交互式编辑。 只要设置好操作,自动进行。
sed 命令的格式
sed [选项] 命令 文件
sed 的选项
选项 | 含义 |
---|---|
-n | 安静模式,只有被处理过行才显示 |
-e | 指令模式,可以有多个,表示多个执行指令 |
-f | 从文件中获得操作的命令 |
-r | 使用扩展的正则表达式 |
-i | 直接写原文的内容,该操作有一定的危险性 |
--posix | 禁用GUN sed 扩展功能 |
-s | 默认sed 会把多个文件当做一个流, GNU sed 可以把他们当做多个文件 |
sed 常用的指令
指令 | 含义 |
---|---|
a | 下一行新增 |
i | 上一行插入字符 |
d | 删除 |
c | 取代 c后可以带字符串 |
p | 打印 |
s | 替换,可以用正则 |
= | 打印行号 |
这里指令和vi的操作类似
指令格式
i -- innert ; a -- append ; d -- delete , s -- substitution
执行格式
address{
command1
command2
command3
}
命令一行一个,右边的大括号必须单独一行
sed 是的示例
sed '2a 第二行后加上本行内容' file.txt
sed '2i 第二行前加上本行内容' file.txt
sed 's/yes/no/g' file.txt # 全部替换
sed '10,11d' #删除十一十二行
sed -f sed.sh file.txt
多个指令的执行方式
sed 's/a/1/;s/b/2/;s/c/3/' file.txt
sed -e 's/a/1/' -e 's/b/2/' -e 's/c/3/' file.txt
sed '
>s/a/1/
>s/b/2
>s/c/3' file.txt
或者可以使用 -f
对指定的行进行操作
对指定行的操作,可以使用一下几种方式。
1. 指定的行比如 ,2 第二行, $ 最后一行
2. 行的范围 比如 2,5
3. 正则匹配的行 /regexp/
4. 步长,比如 1~2 表示 1,3,5 行; 1~3 表示 1,4,7行
5. n行后的x行, n,+x
替换指令
[address]s/pattern/replacement/flags
# 仅仅替换第二行中的第一个 1
sed '2s/1/x/' test.txt
# 替换第二行中的全部1
sed '2s/1/x/g' test.txt
# 替换第二行中的,第2个1
sed '2s/1/x/2' test.txt
# 如果第二行有1打印改行,并替换第一1位x
sed -n '2s/1/x/p' test.txt
# 写入模式
sed -n '2s/1/x/w' test.txt
# replacement 的特殊字符
# 输出 abc123abc123, & 表示匹配的内容
echo "abcabc" | sed 's/abc/&123/g'
# \n 表示第n个匹配, 输出 abccfg 输出的是两个c
echo "abcfg" | sed 's/\(c\)/\1\1/g'
sed 使用脚本示例
cat > file.txt
this is one line
this is two line
thie is thre line
cat > sed.sh
/thre/{
s/thre/three/
}
cat > sed2.sh
/thre/{
s//three/
}
sed -f sed.sh file.txt
# sed2.sh //three/ 中 // 如果是空的使用 第一行中的 /thre/
# 给h添加标签
cat sed.sh
/h[0-9]/{
s//\<&\>/1
s//\<\/&\>/2
}
# 使用:作为/的替换符, 避免 / 转义, 输出 a1xc3
echo 'a1b/2c3' | sed 's:b/2:x:'