• Linux 文本替换 字符串替换 221012笔记


    Linux 文本替换 字符串替换

    sed 命令进行文本字符串替换

    公式 sed s/被替换/替换/gsed -e s/被替换/替换/gsed --expression s/被替换/替换/gsed --expression=s/被替换/替换/g

    • g 表示全局, 没有则只替换第一个,
      也可以用数字,表示第几个, s/a/b/2将第2个a换成b

    • 可加单双引号或不加 sed "s/被替换/替换/g"sed 's/被替换/替换/g'
      在有特殊字符时,必须加单双引号
      例如

      • 在有 空格或;分号等情况下,要加用 单'或双" 引号
      • 在有$等字符的情况下, 必须,只能加 ' 单引号
    • 可加-e空格 或--expression空格 或 -expression=不加空格
      例如替换所有 a 为 B
      sed s/a/B/g等效 sed 's/a/B/g'等效 sed "s/a/B/g"
      等效 sed -e s/a/B/g 等效 sed --expression s/a/B/g等效 sed --expression=s/a/B/g
      等效 sed -e 's/a/B/g' 等效 sed --expression "s/a/B/g"等效 sed --expression='s/a/B/g'

    • 如果有多个脚本(expression/scripts), 则必须加-e--expression 或者用大括号(花括号){}包裹,以分号分隔
      例如先将 a换b, 再 b换c , c换d , d换e , e换E , E换D , D换C , C换B , B换A
      sed -e s/a/b/g -e "s/b/c/g" -e 's/c/d/g' -e s/d/e/g --expression s/e/E/g --expression "s/E/D/g" --expression 's/D/C/g' --expression=s/C/B/g --expression='s/B/A/g'
      测试

      echo aaaaaaaaa | sed -e s/a/b/g -e "s/b/c/g" -e 's/c/d/g' -e s/d/e/g --expression s/e/E/g --expression "s/E/D/g" --expression 's/D/C/g' --expression=s/C/B/g --expression='s/B/A/g' 
      
      • 1
      echo aaaaaaaaa | sed '{s/a/b/g; ; ; ; ;s/b/c/g;s/c/d/g;s/d/e/g;;;s/e/E/g;;s/E/D/g;;s/D/C/g;s/C/B/g;s/B/A/g; }'
      
      • 1

      如果不带g则只替换第一个

      echo aaaaaaaaa | sed -e s/a/b/ -e "s/b/c/" -e 's/c/d/' -e s/d/e/ --expression s/e/E/ --expression "s/E/D/" --expression 's/D/C/' --expression=s/C/B/ --expression='s/B/A/' 
      
      • 1
    • 要想删除指定字符串的话, 就将替换内容设为空
      例如:
      删除所有 abc : sed s/abc//g

      echo abcabcabcdefg | sed s/abc//g
      
      • 1

      删除第一个 abc : sed s/abc//

      echo abcabcabcdefg | sed s/abc//
      
      • 1
    • 大括号{}(花括号) 用来包裹多个命令,用分号;分隔 {命令1;命令2;命令3;...}

      • 当大括号内只有一个命令时, 可以不加引号
      • 当大括号内有多个命令,用分号;分隔时, 必须加 单或双 引号
        echo aaa | sed "{s/a/A/;s/aa/B/}" # 得到 AB
        
        • 1
        也可有空格
        echo aaa | sed  "  { s/a/A/ ;    s/aa/B/  }   "   # 得到 AB
        
        • 1
        echo aaaaaaaaa | sed '{s/a/b/g; ; ; ; ;s/b/c/g;s/c/d/g;s/d/e/g;;;s/e/E/g;;s/E/D/g;;s/D/C/g;s/C/B/g;s/B/A/g; }'
        
        • 1
    sed修改来自文件的内容

    公式: sed s/被替换/替换/g 文件 , 文件必须放在最后
    例如: 替换来自文件中的 aaa 变 BBB

    sudo sed s/aaa/BBB/g 文件
    		或
    sudo sed "s/aaa/BBB/g" 文件
    		或
    sudo sed -e s/aaa/BBB/g 文件
    		或
    sudo sed --expression s/aaa/BBB/g 文件
    		或
    sudo sed --expression=s/aaa/BBB/g 文件
    		或
    sudo sed --expression="s/aaa/BBB/g" 文件
    		或
    sudo sed --expression='s/aaa/BBB/g' 文件
    		也可以用管道
    sudo cat 文件 | sudo sed --expression='s/aaa/BBB/g'
    sudo cat 文件 | sudo sed --expression 's/aaa/BBB/g'
    sudo cat 文件 | sudo sed --e 's/aaa/BBB/g'
    sudo cat 文件 | sudo sed 's/aaa/BBB/g'
    sudo cat 文件 | sudo sed s/aaa/BBB/g
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    -i--in-place 选项, 就会对文件进行修改

    -i[SUFFIX], --in-place[=SUFFIX]
    -i--in-place 选项后如果有后缀, 就会以文件名加后缀给文件做个备份, 再修改
    -i与后缀紧连,没有空格, 如-i.bak
    --in-place 与后缀通过等号=连接 , 如 --in-place=.bak

    printf "aaa\n" > 文件; cat 文件;
    sudo sed 's/aaa/bbb/' "文件" -i ;
    cat 文件;
    sudo sed 's/bbb/ccc/' 文件 --in-place ;
    cat "文件";
    sudo sed 's/ccc/ddd/' 文件 -i.bak1;
    cat 文件;
    sudo sed 's/ddd/eee/' "文件" --in-place=.bak2;
    cat "文件";
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    sed修改来自变量的内容

    echo默认会加换行, 加上-n,可不换行 , 也可以用printf
    -echo $变量屏幕输出时,会将连续空格合并为一个, 可以用echo "$变量"原样输出
    printf $变量输出时,变空格会变成参数分隔, 所以加双引号 printf "$变量"

    v=`printf "$v" | sed s/待替换内容/替换内容/g`v=$(printf "$v" | sed s/待替换内容/替换内容/g)v=$(echo -n "$v" | sed s/待替换内容/替换内容/g)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    例子:

    v='hello   World' ; echo "$v";\
    v=`echo -n "$v" | sed s/h/H/`; echo "${v}"
    
    
    • 1
    • 2
    • 3
    v='Helloorld' ; echo "$v";\
    v=`echo "$v" | sed 's/oo/o Wo/'`; echo "${v}"
    
    
    • 1
    • 2
    • 3
    v='World' ; echo "$v";\
    v=`printf "$v" | sed 's/^/Hello /'`; echo "${v}"
    
    
    • 1
    • 2
    • 3
    v='Hello' ; echo "$v";\
    v=`printf "$v" | sed 's/$/        World/'`; printf "${v}\n"
    
    
    • 1
    • 2
    • 3
    v='Hello' ; echo "$v";\
    v=`printf "$v" | sed 's/$/\ \ \ \ \ \ World/'`; printf "${v}\n"
    
    
    • 1
    • 2
    • 3
    v='H   o W   d' ; echo "$v";\
    v=`printf "$v" | sed '{s/   /ell/ ; s/   /orl/}'`; printf "${v}\n"
    
    
    • 1
    • 2
    • 3
    v='H   o W   d' ; echo "$v";\
    v=`printf "$v" | sed '{\
    s/ /l/7 ;\
    s/ /r/6 ;\
    s/ /o/5 ;\
    s/ /l/3;\
    s/ /l/2;\
    s/ /e/1;\
    }'`; printf "${v}\n"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    例如移除环境变量PATH中的指定字符串
    export PATH=`  printf "$PATH" | sed ' s/:\.//g '  ` ; echo "$PATH";
    
    • 1
    export PATH=`  printf "$PATH" | sed ' s/:\/MyBashs//g '  ` ; echo "$PATH";
    
    • 1
  • 相关阅读:
    Python---数据容器分类及通用操作
    MySQL主从复制最全教程(CentOS7 yum)
    HBuilderX vue项目打包上传到服务器
    .NET MAUI RC 是完整的 API 并准备好起飞 (GA)
    反恐验厂所需材料清单
    C高级第2天
    ubuntu20.04.5 LTS搭建高可用k3s集群
    kubesphere3.4.1不同等级告警发送至不同邮箱
    龙芯3a5000下编译nginx源码
    结构建模设计——Solidworks软件之特征成型中异形孔向导和线性阵列功能实战总结
  • 原文地址:https://blog.csdn.net/kfepiza/article/details/127274959