目录

Sed语法

语法格式

常用参数说明

命令解释

删除、替换、增加字符串

删除

添加

替换

分割符不一定是"/"可以是任意的符号,如@

替换/删除匹配的字符之间的内容

在每一行的行首/尾添加字符串

在匹配行的行首/尾添加字符串

匹配行首,行尾后替换或添加字符

提取字符串

匹配任意个空格

附录1:全部参数说明

注意事项和报错

扩展资料:



作者:bandaoyu,本文持续更新。地址:https://blog.csdn.net/bandaoyu/article/details/120047612

Sed语法

语法格式

调用sed命令有两种形式:sed [options] "command" file(s)sed [options] -f scriptfile file(s)

sed 语法_xuqq999_51CTO博客

$ sed -i.bak '10 s#netmask#aaaaaaaaaaaa#' file

-i.bak 表示直接对原文件进行编辑的同时做备份;

常用参数说明

option:

-n :只打印模式匹配的行

-e :直接在命令行模式上进行sed动作编辑,此为默认选项

-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作

-r :支持扩展表达式

-i :直接修改文件内容

命令command:

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

a\ 在当前行下面插入文本;
i\ 在当前行上面插入文本;
c\ 把当前行改为新的文本;
d 删除,将选择的内容删除
D 删除模板第一行
s 替换指定字符 (最常用)
p 打印模板块的行。(常常和 -n配合使用)
P 打印模板块的第一行;

标记:

g 表示行内全部替换,ng表示第n个匹配的开始进行替换
w 表示把行写入一个文件
\1 字串匹配标记(划重点)
& 已匹配字符串标记

原文链接:https://blog.csdn.net/y1412813204/article/details/83578281

全部参数说明

在本文末尾附录1 或sed 语法_xuqq999_51CTO博客

sed命令用法详解 - 呼长喜 - 博客园

命令解释

/某字符串/       匹配//中间放的字符串的行,加^表示匹配行首,如:

1、/^+/                                          匹配行首字符串为“+”的行

s表示替换,s/字符串1/字符串2/ 表示用字符串2替换字符串1,.* 表示当前行,如:

s/.*/+x/  替换当前行为+x

n;n; 读入下一行;再读入下一行

n; 读入下一行

2、'/ClientAliveCountMax/ s/^#//'  匹配含ClientAliveCountMax的行,s表示替换,^表示行首,既替换匹配含ClientAliveCountMax的行,将行首的#,替换为“”,即去掉#。

删除、替换、增加字符串

sed中的分割符不一定是"/"可以是任意的符号,如@

删除

删除匹配的行

sed  -i    "/Manager/d"     employee.txt   #删除含Manager的行

删除匹配字符之间的内容

# Delete text between patterns, excluding the lines containing these patterns(不删除所在行):

sed -i "/PATTERN-1/,/PATTERN-2/{//!d} "input.txt

# Delete text between patterns, including the lines containing these patterns(所在行也删除):

sed -i "/PATTERN-1/,/PATTERN-2/d " input.txt

# To delete all the lines after PATTERN, use this

sed -i   "/PATTERN/,$d " input.txt

[sed] Delete the lines lying in between two patterns | *NIX Tricks

sed -i "/#hwBegin/,/#hwEnd/d " /etc/my.cnf     #就是将#hwBegin行到#hwEnd行之间内容,包括

#hwBegin行和#hwEnd行都删除,-i表示编辑的是文件

#add '-----here is the content---' to CONF_DIR behind the "[mysql]"

#use command 'sed' to add A behind "pattern" :sed 's/pattern/&A/' filename

用命令'sed'在filename文件内匹配的字符"pattern"后面添加内容A

#!/bin/ashCONF_DIR="/etc/my.cnf"sed -i "s/\[mysqld\]/&\n \wait_timeout=2073600\n \interactive_timeout=2073600\n \bulk_insert_buffer_size=16M\n \max_allowed_packet=16M\n/"  /etc/my.cnf

添加

匹配含“pipeimepipeime”这一行进行添加

#匹配行前加

sed -i "/pipeimepipeime/iallow www.361way.com " the.conf.file

#匹配行前后

sed -i "/pipeimepipeime/aallow www.361way.com " the.conf.file

而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛 。代码就变成了:

sed -i "/2222222222/a\3333333333 " test.txt

sed -i "/2222222222/i\3333333333 " test.txt

这就就可以很方便的看出要在某一行前或某一行后加入什么内容 。不过经常我记不住a 、i 那个是前那个是后。我的记法是a = after ,i = in front 。

替换

sed  “s/要被替换的字符串/新的字符串/g”

替换文件内的内容:

sed  -i “s/要被替换的字符串/新的字符串/g”  test.txt

s表示替换,三根斜线中间是替换的样式,特殊字符需要使用反斜线”\”进行转义.

详见:http://www.jb51.net/LINUXjishu/155122.html

g代表每行出现的字符全部替换,如果没有g则只会替换每行第一个,而不继续往后找了

linux shell 用sed命令在文本的行尾或行首添加字符 - aaronwxb - 博客园

分割符不一定是"/"可以是任意的符号,如@

比如想把1.txt中

wav/dev/third_party/B00000/DEV_T0000000000/S00000.wav
wav/dev/third_party/B00000/DEV_T0000000001/S00000.wav

wav/dev/third_party/B00000/DEV_T0000000000/S00000.wav中的wav/dev/third_party/B00000 替换为wav:

$ sed -i "s@wav/dev/third_party/B00000@wav@ "  1.txt

替换/删除匹配的字符之间的内容

1
2
3
4
5

#删除<\/schema>和<heartbeat>字符串之间的内容
sed -i '/<\/schema>/,/<heartbeat>/{//!d}' ./schema.xml
#替换dataNode=".*".*rule="sharding-by-intfile" 为dataNode=" " rule="sharding-by-intfile"  .*表示0各或任意个字符

#sed用单引号,所以里面的双引号不用转移符号
sed -i 's/dataNode=".*".*rule="sharding-by-intfile"/dataNode=" " rule="sharding-by-intfile"/g' ./schema.xml

在每一行的行首/尾添加字符串

在每行的头添加字符,比如"HEAD",命令如下:

sed "s/^/HEAD&/g " test.file

在每行的行尾添加字符,比如“TAIL”,命令如下:

sed "s/$/&TAIL/g " test.file

几点说明:

1."^"代表行首,"$"代表行尾

linux shell 用sed命令在文本的行尾或行首添加字符 - aaronwxb - 博客园

在匹配行的行首/尾添加字符串

匹配含dddd的行,在行首添加666

sed  -i "s/^.*dddd/666&/g" sed.txt

匹配含dddd的行,在行尾添加666

666& 表示添加到行首,&666 表示添加到行尾。

在第100行首/尾添加字符串

sed "100 s/^/HEAD&/g " test.file

sed "100 s/$/&TAIL/g " test.file

匹配字符串前添加

匹配含dddd的行,匹配字符串前添加

sed  -i "s/^dddd/666&/g" sed.txt

https://www.jianshu.com/p/4de5d9901865

匹配行首,行尾后替换或添加字符

sed匹配某一行开头,替换整行内容

sed -i "/^cloud_server/ccloud_server_ip = update" name.txt

sed 匹配行中部分内容,替换整行

[root@centos8-38 opt]# sed  '/.*dddd.*/c'$coud'' sed.txt

sed 也可以匹配行首或是行尾,中间部分内容后,

再行首或是行尾添加内容。

如下面:

666& 表示添加到行首,&666 表示添加到行尾。

[root@centos8-38 opt]# sed "s/^ccc/666&/g" sed.txt

作者:搬石头
链接:https://www.jianshu.com/p/4de5d9901865

提取字符串

现在有如下一串字符串:

"asdfkjasldjkf"shiner"df

需求:

需要提取出shiner子字符串。

命令如下:

[root@localhost /]$  echo "asdfkjasldjkf\"shiner\"df" | sed 's/\(.*\)"\(.*\)"\(.*\)/\2/g'     #搜索shiner

命令解释

s: 表示替换命令

\(.*\)" : 表示第一个引号前的内容

"\(.*\)":表示两引号之间的内容

)"\(.*\):表示引号后的内容

\2: 表示第二对括号里面的内容

括号里的表达式匹配的内容,可以用\1,\2等进行引用,第n个括号对内的内容,就用\n引用。

这个命令的意思是:

用\2代表的第二个括号的内容(shiner)去替换整个字符串,这样就得到了我们所需要的子字符串了。

例子

其中的${1}是执行脚本是给的参数,例如 [root@hopewind]# setschema.sh   50

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

#!/bin/sh

#删除</schema>和<heartbeat>之间的内容
sed -i  "/<\/schema>/,/<heartbeat>/{//!d} " ./schema.xml

STATION_NODE_PR='station_dn'
 STATION_NODE='station_dn0001'
 STATION_NODEs='station_dn0001'

STATION_NODE_HOST_PR='hwm_station_'
 STATION_NODE_HOST_PO='_db'
 STATION_NODE_HOST=''
 HOST_CFG=''

for (( i = 1; i < ${1} + 1; i++ )); #${1} 是脚本的第一个参数
do

FORMAT_NUM=$(printf "%04d" ${i})#定数字为4位0001,0002……
    STATION_NODE=${STATION_NODE_PR}${FORMAT_NUM} #${}表示引用STATION_NODE_PR对应的值

if [[ i -eq 1 ]]; then
    
    STATION_NODEs=${STATION_NODE}
   
   else

STATION_NODEs=${STATION_NODEs}','${STATION_NODE}

fi
    
    #添加host的配置
    STATION_NODE_HOST=${STATION_NODE_HOST_PR}${FORMAT_NUM}${STATION_NODE_HOST_PO}
    HOST_CFG='<dataNode name="'${STATION_NODE}'" dataHost="LocalMySql" database="'${STATION_NODE_HOST}'"></dataNode>'
    #在</schema>所在的行后面增加${HOST_CFG}行
    sed -i "/<\/schema>/a\\${HOST_CFG}" ./schema.xml
    
done

#dataNode=".*".*rule="sharding-by-intfile"(.*表示0或任意个字符)替换为dataNode="${STATION_NODEs}"  rule="sharding-by-intfile"(${STATION_NODEs}会展开为变量,因为sed命令用双引号“”,所以里面的双引号要转译
 sed -i "s/dataNode=\".*\".*rule=\"sharding-by-intfile\"/dataNode=\"${STATION_NODEs}\"  rule=\"sharding-by-intfile\"/g" ./schema.xml #替换
  
  #在</schema>所在的行后面增加行<dataNode name="center_dn" dataHost="LocalMySql" database="hwm_center_db"/>
 sed -i "/<\/schema>/a\\<dataNode name=\"center_dn\" dataHost=\"LocalMySql\" database=\"hwm_center_db\"/>" ./schema.xml
 sed -i "/<\/schema>/a\\<dataNode name=\"maintenance_dn\" dataHost=\"LocalMySql\" database=\"hwm_maintenance_db\"/>" ./schema.xml

匹配任意个空格

场景:

*   soft      nofile 630000
*     hard   nofile 654300

grep 匹配如上文本,由于最后一列数字是可变的,并且每列之间可能存在任意个空格或制表符

grep   -E  '^\*[[:space:]]+soft[[:space:]]+nofile|^\*[[:space:]]+hard[[:space:]]+nofile'  /etc/security/limits.conf

将匹配的结果sed 替换最后一列数字

sed -n "s/\*[[:space:]]\+soft[[:space:]]\+nofile.*/\* soft nofile 654350/p;s/\*[[:space:]]\+hard[[:space:]]\+nofile.*/\* hard nofile 654350/p" /etc/security/limits.conf

区别,在匹配任意个数空格或制表符时,grep 的’+’ 不需要转义,sed 需要转义
补充:sed -r 可以实现正则表达式匹配

原文链接:https://blog.csdn.net/rockstics/article/details/111563857

例子:
要将vim /etc/onestor/onestor.conf中的

multi_cluster_set_ha = yes
handy_ha_needed = yes

改为:
multi_cluster_set_ha = no
handy_ha_needed = no
脚本:

sed -i  "s/^multi_cluster_set_ha[[:space:]]\+=.*/multi_cluster_set_ha = no/" /etc/onestor/onestor.conf
sed -i  "s/^handy_ha_needed[[:space:]]\+=.*/handy_ha_needed = no/"/etc/onestor/onestor.conf

附录1:全部参数说明

3. Sed命令
        调用sed命令有两种形式:
        sed [options] 'command' file(s)
        sed [options] -f scriptfile file(s)
      
        a\ :在当前行后面加入一行文本。
        b lable :分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。(转至命令:标记)
        c\ :用新的文本改变本行的文本。
        d :从模板块(Pattern space)位置删除行。
        D:删除模板块的第一行。
        i\ :在当前行上面插入文本。
        h :拷贝模板块的内容到内存中的缓冲区。
        H :追加模板块的内容到内存中的缓冲区
        g :获得内存缓冲区的内容,并替代当前模板块中的文本。
        G :获得内存缓冲区的内容,并追加到当前模板块文本的后面。
        l :列表不能打印字符的清单。
        n :读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
        N :追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
        p :打印模板块的行。
        P :打印模板块的第一行。
        q :退出Sed。
        r file :从file中读行。
        t label :if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。(测试:若对当前行做了替换,转至标记)
        T label :错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
        w file :写并追加模板块到file末尾。
        W file :写并追加模板块的第一行到file末尾。
        ! :表示后面的命令对所有没有被选定的行发生作用。
        s/re/string :用string替换正则表达式re。
        = :打印当前行号码。
        # :把注释扩展到下一个换行符以前。
 
以下的是替换标记
        g:表示行内全面替换。
        p:表示打印行。
        w:表示把行写入一个文件。
        x:表示互换模板块中的文本和缓冲区中的文本。
        y:表示把一个字符翻译为另外的字符(但是不用于正则表达式)
 
4. 选项
        -e command, --expression=command
              允许多台编辑。
        -h, –help
              打印帮助,并显示bug列表的地址。
        -n, --quiet, –silent
              取消默认输出。
        -f, --filer=script-file
              引导sed脚本文件名。
        -V, –version
              打印版本和版权信息。
 
5. 元字符集 
        ^
         锚定行的开始 如:/^sed/匹配所有以sed开头的行。
        $
         锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
        .
         匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
        * 
         匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
        []
         匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
        [^]
         匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
        \(..\)
         保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
        &
         保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
        \<
         锚定单词的开始,如:/\
        \> 
         锚定单词的结束,如/love\&gt;/匹配包含以love结尾的单词的行。
        x\{m\}
         重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。
        x\{m,\}
         重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
        x\{m,n\}
         重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行

注意事项和报错

sed里面需要用变量,要用双引号。

sed命令使用双引号的情况下,可以使用$var(变量)直接引用:

echo | sed "s/^/$RANDOM.rmvb_/g"

13562.rmvb_

sed命令使用单引号的情况下,可以使用'"$var"'引用(单引号,然后双引号,变量):

echo | sed "s/^/'"$RANDOM"'.rmvb_/g "

2442.rmvb_

扩展资料:

注意事项

在sed语句里面,变量替换或者执行shell命令,双引号比单引号少绕一些弯子;所以,sed和变量的关键词搜索的结果,众多都写上替换单引号为双引号。

sed命令中使用双引号的情况下,直接`shell command`或者$(shell command)引用命令执行。

echo | sed "s/^/$(date +"%Y%m%d").rmvb_/g"

20130401.rmvb_# 结果

# 使用环境变量$RANDOM以及旧式命令替换的例子:

echo | sed "s/^/`echo $RANDOM`.rmvb_/g"

29484.rmvb_# 结果

sed 's///g' 与sed 's///' 的区别

+g :匹配每一行有行首到行尾的所有字符

不加g:匹配每一行的行首开始匹配,匹配到第一个符合的字段,就会结束,跳到下一行

更详细的说明:

https://blog.csdn.net/m0_37664906/article/details/78082209

【Shell】Sed 删除、替换、增加字符串相关推荐

  1. 用sed删除匹配到字符串的行

    用sed删除匹配到字符串的行: 语法:sed-i'/关键字符/d'文件名 举例1:匹配"\etc\install.sh" set -i '/\/etc\/install.sh/d' ...

  2. linux shell sed 删除文件 前几行

    sed命令 不加参数i 就只看到结果,没写入a.txt文件,加 参数i 就写入了 如果有不大确定删除效果的,就先不加 参数i 1,删除首行 $ sed -i '1d' a.txt 2,删除前100行 ...

  3. linux sed命令替换目标字符串所在行整行为给定值

    sed -i "s,^flyway.url=.*$,flyway.url=__URL__,g" $1 sed -i "s,^flyway.user=.*$,flyway. ...

  4. linux bash shell sed 删除匹配行

    [yeqiang@harbor tmp]$ cat a.txt aaa bbb ccc [yeqiang@harbor tmp]$ sed -i '/aaa/d' a.txt [yeqiang@har ...

  5. linux 给文件替换字符串/替换内容/替换某行 (shell,sed)

    本文是要讲linux 不打开文档/文件的情况下,替换文本内容. 打开文档,在文档/文件内替换内容的,可以用vim,可参考这篇文章vim 替换文本 . 话题相关 #linux 文件替换字符串 #sed ...

  6. shell :linux sed 批量替换字符串

    linux sed 批量替换字符串 一月 21, 2014 ( No Comments ) Linux下批量替换多个文件中的字符串的简单方法.用sed命令可以批量替换多个文件中的字符串. 命令如下: ...

  7. linux替换某一行中字符串,linux 给文件替换字符串/替换内容/替换某行 (shell,sed)...

    本文是要讲linux 不打开文档/文件的情况下,替换文本内容. 打开文档,在文档/文件内替换内容的,可以用vim,可参考这篇文章vim 替换文本 . 话题相关 #linux 文件替换字符串 #sed ...

  8. shell脚本中使用sed替换路径字符串

    示例场景如下: shell中获取某一bin的路径(如ctags),并将其写入到某一配置文件(如.vimrc)中. 首先 ctags_bin=`which ctags` 获取bin的路径,然后插入到配置 ...

  9. sed 删除匹配行的指定字符串

    这里以nginx配置文件为例,修改日志格式. log_format main '$remote_addr - $remote_user [$time_local] "$request&quo ...

  10. [sed] linux sed 批量替换字符串-转

    比如,要将目录/modules下面所有文件中的zhangsan都修改成lisi,这样做: sed -i "s/zhangsan/lisi/g" `grep zhangsan -rl ...

最新文章

  1. oracle exec 和 call 区别
  2. Swift中使用typealias定义一个闭包closure
  3. oracle xclock xmanager
  4. 怎样在不处理的情况下在ABBYY FineReader中添加图像
  5. HTTP协议:看个新闻原来这么麻烦
  6. JVM源码分析之安全点safepoint
  7. HttpWatch截取网页数据的工具以及介绍
  8. python游戏代码示例_练习项目20:使用python制作游戏(中)
  9. 初学Android,字符串,数字,尺寸,数组资源(十二)
  10. 你知道他们的输出结果吗?
  11. 微信小程序实现轨迹回放
  12. db_host 直接用ip地址吗_新买的粉扑能直接用吗?使用粉扑要注意什么?
  13. sts中给项目添加服务器,sts创建java web项目
  14. [基础]全局组、域本地组、通用组的区别与联系
  15. 12.sql语句增删改查快速回顾
  16. 大华海康宇视等监控安防摄像头如何通过GB/T28181平台接入到GB28181国标流媒体平台
  17. ArcMap通过空间校正工具转换BJ-54坐标系到WGS-84坐标系
  18. 完全二叉树的高度为什么是对lgN向下取整
  19. linux调整列显示宽度,使单元格或列自动调整宽度 - 在SWT中使用OLE操纵Excel_Linux编程_Linux公社-Linux系统门户网站...
  20. linux屏幕怎么暗一点,Ubuntu 12.10 调节屏幕亮度经验分享

热门文章

  1. 计算机的品牌和发展历程,世界著名电脑品牌苹果的发展历程
  2. 三国英杰之赵云传java7723_幻世三国之赵云传奇
  3. csp202109-1:数组推导 题解
  4. 解决Tomcat运行内存不足问题
  5. scheduling jobs未起来
  6. tableau 日周月筛选器_Tableau技巧——快速计算同比和环比(及其衍生)
  7. 骨传导耳机靠谱吗?骨传导耳机是不是智商税?
  8. win10命令行动态调整网卡优先级
  9. 使用Xbox360手柄控制你的turtlebot/rbx1/mrobot小车机器人
  10. android webp格式的图片,Android使用webp格式图片的步骤