sed命令的使用

    技术2026-02-07  1

    ----来源于网络整理

    0、前言

    1)sed: stream  editor   流编辑器的缩写;

    2)sed命令用来处理文件内容的数据。与awk相对应(awk是处理列数据)

    3)语法上与vi中的语法很像;

    4)sed 默认支持basic正则,所以,有的字符需要转义,比如()

    如果想不转义,,需要添加-r 参数;  sed -r ..........

    5)命令真正反映在文件中,需要添加  -i 参数,不加i参数,只是在屏幕上会显示改变后的结果,但文件中并没有改变。

    6)-n 参数,静默输出,将非打印内容屏蔽

    7)-e 指定不同的替换命令,比如同时有多个替换命令。

    1、两种格式:

    1)sed  参数 ‘脚本语句’  待操作文件     ------>脚本语句格式  /pattern/action   ---->pattern 是正则表达式action是编辑动作

    2)sed  参数 -f    ‘脚本文件’  待操作文件

    ps:使用单引号和双引号都行。

    2、写在脚本语句中的参数:

    a,append   追加------------>相当于在行的下一行添加行

    i, insert  插入----------------->相当于在行的上一行添加行

    d,delete 删除

    s,substitution   替换

    示例:

    1)sed '3a hello'  test.sh   ----->在第3行追加 hello----->只会在屏幕中显示,并没有真正改变文件

    2)sed -i '3a hello'  test.sh ---->真正改变文件    --->添加 -i参数 ,结果会反应到文件中。

    3)sed '3i  world'  test.sh ------->在第3行前面添加一行world,未加-i 参数,不会反应到文件

    4)sed '3d'  test.sh ------->删除第3行,未加-i 参数,不会反应到文件

    5)sed '3,6d'  test.sh  ------->删除第3-6行,未加-i 参数,不会反应到文件

    6)sed 's/echo/printf/g'   test.sh ------->将echo替换为printf  /g表示如果一行有多个echo,则全部替换

    ------sed '/echo/s/echo/printf/g' test.sh   --------->实际上可以这么写,先找到ehco所在行,然后,使用printf替换echo,这样就与 /pattern/action 格式一致了,第一种形式是这种形式的简写。

    7)sed 's/echo/--&--/g'   test.sh ------->将echo替换为--echo--  /g表示如果一行有多个echo,则全部替换

    8)sed 's/([0-9])([0-9])/-\1-~\2~\g'  test.sh ---->将连续的两个数字(也可以是多个数字)中第1个数两边添加-,第2个数两边添加~           ------>

    或者   sed -r  's/echo/--&--/g'   test.sh --->&是占位符,代替前面的echo.

    9)sed 's/echo/printf/g;s/hello/world/g'   test.sh ------------->同时替换多个字符串 (不用-e的话,用分号隔开)或者

    sed -e 's/echo/printf/g'  -e 's/hello/world/g'   test.sh ------------->同时替换多个字符串

    10)sed  -n   '/hello/p'  tesh.sh   ----------》将包含hello串的行打印出来。---->-n参数表示输出静默,不想打印的内容就不显示了。

    不写n参数的话,hello会显示两遍,其他的内容也会显示。

    11)sed  '/hello/d'  test.sh   ----》删除包含hello的行,要反应到文件中加 -i参数

    12)去掉html中的带<> 的部分

    <html><head><title>hello world</title></head>

    <body>welcome to the world of regexp</body></html>

    方法:将带<>的部分替换成空

    sed 's/<.*>//g' test.html  发现所有字符都变为空了,

    正则表达式有贪心算法,数量限定符会匹配尽可能长的字符串,也就是说*将从<html>中的h一直匹配到了</html>中的l ;

    正确写法:

    sed 's/<[^<>]*>//g' test.html 

     

    Processed: 0.854, SQL: 9