1. 写在前面
本文主要介绍:Linux “sed” 用于文本处理命令;
2. sed 命令
UNIX 中的 sed 命令是一种流编辑器,流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换,例如搜索、查找和替换、插入或删除。虽然在某些方面类似于编辑器(vi),但它只对输入流进行一次处理,因此效率更高。”sed”在管道中过滤文本的能力是它与其他类型编辑器的主要区别。
• sed 是一个功能强大的文本流编辑器。可以进行插入、删除、搜索和替换;
• unix 中的 sed 命令支持正则表达式,允许它执行复杂的模式匹配;
命令的基本语法如下:
sed OPTIONS... [SCRIPT] [INPUTFILE...]
备注:示例文本文件:text.txt
cat > ./text.txt
----------------------------------
Knox in box.
Fox in socks.
Knox on fox in socks in box, Knox on fox in socks in box.
Socks on Knox and Knox in box, Knox on fox in socks in box.
Fox in socks on box on Knox.
注意:上述文本输入完内容之后,按住ctr+c
来保存退出。
2.1 示例
(1)替换每行出现的第一个字符或字符串
sed 's/<old_text>/<new_text>/' <fileName>
-
s 代表替代;
-
/ 是分隔符。我们还可以使用其他分隔符,如 “,”,”空格”;
-
默认情况下,sed 命令会替换每行中第一个出现的
old_text
,并且不会替换第二个、第三个…;
root@dev:~/linux# sed 's/K/*/' ./text.txt
---------------------------------------------------------------
*nox in box.
Fox in socks.
*nox on fox in socks in box, Knox on fox in socks in box.
Socks on *nox and Knox in box, Knox on fox in socks in box.
Fox in socks on box on *nox.
(2)替换一行中出现的第 n 个字符或字符串
使用 /1、/2
等参数,替换一行中old_text
的第一次、第二次出现。以下命令将单词“Knox”的第二次出现替换为一行中的“linux”。
root@dev:~/linux# sed 's/Knox/linux/2' text.txt
---------------------------------------------------------------
Knox in box.
Fox in socks.
Knox on fox in socks in box, linux on fox in socks in box.
Socks on Knox and linux in box, Knox on fox in socks in box.
Fox in socks on box on Knox.
(3)替换一行中出现的所有字符或字符串
参数 /g
(全局替换)指定 sed 命令以替换行中出现的所有字符串。
root@dev:~/linux# sed 's/Knox/linux/g' text.txt
---------------------------------------------------------------
linux in box.
Fox in socks.
linux on fox in socks in box, linux on fox in socks in box.
Socks on linux and linux in box, linux on fox in socks in box.
Fox in socks on box on linux.
(4)替换一行中从第 n 次出现到所有出现的次数
使用 /1、/2
等和 /g
的组合来替换一行中第 n 次出现后的所有字符串。以下 sed
命令替换第三个“in”出现后所有“in”字符串。
root@dev:~/linux# sed 's/in/--/3g' text.txt
---------------------------------------------------------------
Knox in box.
Fox in socks.
Knox on fox in socks in box, Knox on fox -- socks -- box.
Socks on Knox and Knox in box, Knox on fox in socks -- box.
Fox in socks on box on Knox.
(5)每个单词的第一个字符增加括号
此 sed 示例在括号中打印每个单词的第一个字符。
root@dev:~/linux# echo "Welcome To The Zhi Fei Ji" | sed 's/(b[A-Z])/(1)/g'
-------------------------------------------------------------------------------------
(W)elcome (T)o (T)he (Z)hi (F)ei (J)i
(6)替换特定行号上的字符串
可以限制 sed 命令替换特定行号上的字符串。
root@dev:~/linux# sed '3 s/Knox/linux/' text.txt
---------------------------------------------------------------
Knox in box.
Fox in socks.
linux on fox in socks in box, Knox on fox in socks in box.
Socks on Knox and Knox in box, Knox on fox in socks in box.
Fox in socks on box on Knox.
上面的 sed 命令仅替换第三行的字符串。
(7)用 /p
复制被替换的行
/p
会在终端上打印两次被替换的行。如果某行没有搜索到,也没有被替换,则 /p
只打印该行一次。
root@dev:~/linux# sed 's/Knox/linux/p' text.txt
---------------------------------------------------------------
linux in box.
linux in box.
Fox in socks.
linux on fox in socks in box, Knox on fox in socks in box.
linux on fox in socks in box, Knox on fox in socks in box.
Socks on linux and Knox in box, Knox on fox in socks in box.
Socks on linux and Knox in box, Knox on fox in socks in box.
Fox in socks on box on linux.
Fox in socks on box on linux.
(8)只打印被替换的行
使用 -n
选项和 /p
选项,只显示被替换的行,在这里,-n
选项会抑制 /p
产生的重复行,只打印一次被替换的行。
root@dev:~/linux# sed -n 's/Knox/linux/p' text.txt
---------------------------------------------------------------
linux in box.
linux on fox in socks in box, Knox on fox in socks in box.
Socks on linux and Knox in box, Knox on fox in socks in box.
Fox in socks on box on linux.
如果只使用 -n
而不使用 /p
,则 sed 不会打印任何内容。
(9) 替换一系列行的字符串
可以为 sed 命令指定行号范围,以替换字符串。
root@dev:~/linux# sed '1,3 s/Knox/linux/' text.txt
---------------------------------------------------------------
linux in box.
Fox in socks.
linux on fox in socks in box, Knox on fox in socks in box.
Socks on Knox and Knox in box, Knox on fox in socks in box.
Fox in socks on box on Knox.
在这里,sed 命令替换了范围为 1 到 3 的行。另一个例子是:
root@dev:~/linux# sed '3,$ s/Knox/linux/' text.txt
---------------------------------------------------------------
Knox in box.
Fox in socks.
linux on fox in socks in box, Knox on fox in socks in box.
Socks on linux and Knox in box, Knox on fox in socks in box.
Fox in socks on box on linux.
这里的 $
表示文件的最后一行。因此,sed 命令会替换文件中从第3行到最后一行的文本。
(10)删除特定文件中的行
sed 命令还可用于删除特定文件中的行。sed 命令用于执行删除操作,甚至无需打开文件:
-
删除某一行,例如本例中的 n 行
语法:sed 'nd' filename.txt
示例:
root@dev:~/linux# sed '5d' text.txt
---------------------------------------------------------------
Knox in box.
Fox in socks.
Knox on fox in socks in box, Knox on fox in socks in box.
Socks on Knox and Knox in box, Knox on fox in socks in box.
-
删除最后一行
语法:sed '$d' filename.txt
示例:
root@dev:~/linux# sed '$d' text.txt
---------------------------------------------------------------
Knox in box.
Fox in socks.
Knox on fox in socks in box, Knox on fox in socks in box.
Socks on Knox and Knox in box, Knox on fox in socks in box.
-
删除 x 至 y 范围内的行
语法:sed 'x,yd' filename.txt
示例:
root@dev:~/linux# sed '1,3d' text.txt
---------------------------------------------------------------
Socks on Knox and Knox in box, Knox on fox in socks in box.
Fox in socks on box on Knox.
-
从第 n 行到最后一行删除
语法:sed 'nth,$d' filename.txt
示例:
root@dev:~/linux# sed '2,$d' text.txt
---------------------------------------------------------------
Knox in box.
-
删除字符串匹配行
语法:sed '/pattern/d' filename.txt
示例:
root@dev:~/linux# sed '/Fox/d' text.txt
Knox in box.
Knox on fox in socks in box, Knox on fox in socks in box.
Socks on Knox and Knox in box, Knox on fox in socks in box.
感谢您花时间阅读文章
收藏本站不迷路
///// 往期精彩/////
原文始发于微信公众号(滑翔的纸飞机):Linux 命令:sed
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/260976.html