【Shell】Sed 删除、替换、增加字符串

目录

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/ash

CONF_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

添加

#匹配行前加

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

#匹配行前后

sed -i "/allow 361way.com/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})#定数字为40001,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_# 结果

posted on 2022-10-04 01:22  bdy  阅读(1924)  评论(0编辑  收藏  举报

导航