sed操作集锦

  |  

摘要: 本文记录一下日常的项目中遇到的 sed 的问题以及解决方案

【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings


在某一行后面插入内容

a 命令

1
2
3
4
5
CONTENT=...
for file in `find ...`
do
sed -i "1 a ${CONTENT}" ${file}
done

在某一行前面插入内容

i 命令

1
2
3
4
5
CONTENT=...
for file in `find ...`
do
sed -i "1 i ${CONTENT}" ${file}
done

删除第 n 行

d命令

1
2
3
4
sed -i "1d" file # 删第1行
sed -i "nd" file # 删第n行
sed -i "$d" file # 删最后1行
sed -i "1,5d" file # 删第1和5行

读取第 n 行

1
sed -n Np file

替换匹配到的文本

s 命令

1
2
3
4
5
6
7
FOLD=...

for FILE in `ls ${FOLD}`
do
file=${FOLD}${FILE}
sed -i "s/pattern/new_pattern/g" ${file}
done

把 pattern 改为 target

匹配单行

sed 脚本如下:

1
s/pattern/target/g;

将pattern替换为target,全局替换,同一行中出现几次替换几次。

1
sed -i -f process.sed filename

匹配多行

有以下形式的文本

1
2
3
4
5
6
7
begin
...pattern...
...
...
...pattern...
...
end

需求: 首先匹配到 begin 和 end,然后 begin 和 end 中间有多行文本,将其中的 pattern 改成目标文本 target。

首先写出以下 sed 脚本,保存为 process.sed

1
2
3
4
5
6
/begin/{
:tag;
n;
s/pattern/target/g;
/end/!btag
}

先匹配 begin,匹配到之后执行大括号里的语句

  • :tag: 设定跳转标签tag
  • n: 读取下一行
  • s/pattern/target/g: 将pattern替换为target,全局替换,同一行中出现几次替换几次
  • /end/!btag: 若当前行匹配不上 end,则跳转到标签tag处继续执行,构成一个循环。若匹配到end,则退出循环,sed重新对读入的每行匹配 begin。
1
sed -i -f process.sed filename

删除指定行和下面几行

例如要删除从匹配到 pattern 的行以及后续的 3 行,共删 4 行

1
sed -i /pattern/,+4d filename

Share