用 sed 替换与删除文本行的三个常用方法
sed 是 Linux 下处理文本行的经典工具,它按行读取输入,对每一行应用你给出的编辑命令,处理完再输出,最适合写在脚本里批量修改文件。下面介绍替换、原地修改和删除行三个最常用的方法。
一、用 s/// 做替换
替换的命令是 s/旧内容/新内容/,基本写法是:
sed 's/apple/banana/' fruit.txt
这行命令把 fruit.txt 每一行中第一个出现的 apple 换成 banana,只输出到屏幕,不改原文件。如果想把一行里所有的 apple 都换掉,在命令末尾加 g:
sed 's/apple/banana/g' fruit.txt
替换内容里如果含有斜杠,可以换一个分隔符,比如用 #,写成 sed ‘s#/old/path#/new/path#g’,可读性更好。如果只想替换每行第二次出现的内容,可以写成 s/apple/banana/2。
二、用 -i 做原地修改
上面的命令默认不改原文件,只是把结果打印出来。加上 -i 参数,sed 就会直接修改原文件:
sed -i 's/DEBUG=false/DEBUG=true/' app.conf
执行后,app.conf 里的 DEBUG=false 就被改成了 DEBUG=true。-i 是破坏性操作,改错了不容易恢复,所以动手前最好先备份,或者先用不带 -i 的命令在屏幕上看一眼结果,确认无误再加 -i 执行。也可以用 -i.bak 让 sed 自动留一个备份文件:
sed -i.bak 's/DEBUG=false/DEBUG=true/' app.conf
执行后会生成 app.conf.bak,里面是修改前的内容,相当于多了一层保险。
三、用 d 删除行
d 命令用来删除行。最常见的是按行号删除,例如删除第 3 行:
sed '3d' data.txt
删除第 2 到第 5 行,可以写成一个范围:
sed '2,5d' data.txt
按内容删除更实用。删除所有包含 error 的行:
sed '/error/d' app.log
删除空行则可以这样写:
sed '/^$/d' data.txt
其中 ^$ 匹配空行。删除行同样可以配合 -i 直接写回文件,例如 sed -i ‘/^$/d’ data.txt 会删掉文件里的全部空行。
小结
替换、原地修改、删除行这三个方法覆盖了日常文本处理的大部分场景:先用不带 -i 的命令在屏幕上确认效果,再加 -i 写回文件,是最稳妥的用法。把这几条命令记熟,写脚本批量处理日志和配置文件时会顺手很多。
- 点赞
- 收藏
- 关注作者
评论(0)