sed

引用连接   http://blog.51cto.com/warm51fun/1891409

特别注意:一般用单引号,当语法正确,但是报错的时候,就换成双引号

以development.yaml 为例进行演示

[root@kube-node3 ~]# cat development.yaml
apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
name: development

1、 ##用途

把数字删除,其实就替换成空就可以了

[root@wy ~]# sed 's#[0-9]##g' /etc/passwd

root:x:::root:/root:/bin/bash

bin:x:::bin:/bin:/sbin/nologin

2、sed -i 和 sed -e 、sed -n 的区别 sed 默认=sed -e

-i 会对文件进行真正的编辑(不建议使用),直接对文本操作 sed -i '1,6d' development.yaml ;只是想看一下操作后的结果 sed -e '1,6d' development.yaml ; -n 显示指定的行

3、注释

批量注释
sed '1,3 s/^/#/g' development.yaml

批量取消注释

sed -i '10,11s/#//g' development.yaml

4、行上、行下操作

在匹配行下面插入一行文字
sed -i '/特定字符串/i 新行字符串' development.yaml

在匹配行下面插入一行文字

sed -i '/特定字符串/a 新行字符串' development.yaml

在匹配行下面插入一行文字

sed '//usr/bin/java/a /usr/local/jdk1.8.0_171/bin/java' /root/test.development.yaml

在匹配行下面插入一行文字

sed '/client/ adefault-character-set = utf8mb4' /etc/my.cnf

在首行插入一行文字

sed "1i #!/bin/bash" a.sh

在最后插入一行文字
sed -i '$a要插入的文字' development.yaml

在第3行上面插入文字
sed '3i hello' /etc/passwd

在第3行下面插入一行文字
sed '2ahello' a.txt

在第3行下面插入两行文字
sed '2ahello hi' a.txt

在第3行下面插入文字
sed '3a hello' /etc/passwd

5、查找替换功能

普通查找替换

sed -i 's/原字符串/新字符串/g' development.yaml

sed只对第三行查找替换

sed = /etc/passwd | sed 'N; s/ / /' | sed '3 s/d/c/g'

sed只对第14行查找替换

sed -i '14 s/ens33/eth0/g' /etc/sysconfig/network-scripts/ifcfg-ens33

sed只对第55行查找替换成空格

sed -i '55 s/!//g' /etc/sudoers

sed 替换特殊字符 /

把 /web/sing/ 替换成  /website/

sed -i 's/web/sing/website/g' test1.conf                #转义符放在斜杠的前面

sed行内整体替换

[root@bogon ~]# echo "Server=127.0.0.1" >> c.file
[root@bogon ~]# cat c.file

Server=127.0.0.1

[root@bogon ~]# sed "2c jenkins=192.168.1.204" c.file

jenkins=192.168.1.204

sed 测试修改某一行并且显示这一行 

[mysql@www ~]$ sudo sed -n "17c Port 62000" /etc/ssh/sshd_config
Port 62000

sed带多个参数使用

sudo sed -i -n "17c Port 62000" /etc/ssh/sshd_config

sed替换字符串内所有的空格 

sed 's/ //g'

实例:  netstat -tnlp |grep -n "httpd" | awk -F '/' '{print $2}'| sed 's/ //g'      不去掉空格就报错

6、打印功能

打印第一行至第三行

sed -n '1,3p' development.yaml

打印第一行与最后一行
sed -n '1p;$p' development.yaml

7、删除功能

删除第二行

sed -i '2d' development.yaml

删除第一行至第三行
sed '1,3d' development.yaml

删除匹配行至最后一行
sed '/spec/,$d' development.yaml

删除最后6行
for i in `seq 1 6`; do sed -i '$d' development.yaml ; done

删除最后一行
sed '$d' development.yaml

删除偶数行
sed 'n;d' development.yaml

隔两行删除一行
sed 'n;n;d' development.yaml

删除匹配行
sed '/development/d' development.yaml

删除特定字符串的行

sed -i '/字符串/d' development.yaml

8、行内操作

查找name 并在其下添加namespace,a表示在其下一行添加文字
sed '/name/anamespace' development.yaml

查找name 并在其上添加namespace,i表示在其下一行添加文字
sed '/name/inamespace' development.yaml

查找以development为结尾的行,并在其行尾添加字符串word,$表示结尾标识符,&表示添加
sed 's/development$/&.v2/' development.yaml

查找以api开头的行,并在其行首添加nginx:
sed -e '/api/s/^/&nginx:/' development.yaml

查找特定字符的行并打印出来
yum repolist | sed -n '/repolist/p'

查找具有特定字符的行,把其中的某个字符进行替换
sed '/kind/s/Namespace/servece/g' development.yaml

 查找具有特定字符的行,把行内所有文字进行替换

[root@www ~]# cat a.txt
hello world
[root@www ~]# sed  -i '/world/s/hello world/service/g' a.txt
service

9、多个sed命令

不保存

多个sed命令组合使用 -e
sed -e 's/development$/&.v2/' -e '/api/s/^/&nginx:/' development.yaml

多个sed命令组合使用 分割符“;”
sed -e 's/development$/&.v2/;/api/s/^/&nginx:/' development.yaml

多个sed命令组合使用&& ----- 用这个
sed 's/development$/&.v2/' development.yaml && sed '/api/s/^/&nginx:/'" development.yaml

保存

sed -i -e '/client/ adefault-character-set = utf8mb4' -e '$adefault-character-set = utf8mb4' /etc/my.cnf

10、sed引用变量


sed读取系统环境变量进行替换

name=apache
sed "s/development/$name/g" development.yaml

 sed 命令中引用变量加单引号

[root@bogon ~]# cat user_add.sh
#!/bin/bash
name=jenkins
useradd $name

sed -i '92a '$name' ALL=(ALL) ALL' /etc/sudoers

11、sed 模式空间


在每一行后面添加一行
sed '/^$/d; G' development.yaml


每一行后面添加两行
sed '/^$/d; G;G' development.yaml


在前三行每行后面添加一行空白行
sed '/^$/d;1,3G' development.yaml


匹配行前插入一行
sed '/metadata/{x; p; x; }' development.yaml


匹配行后插入一行
sed '/metadata/G' development.yaml


匹配行前后插入一行
sed '/metadata/{x; p; x; G;}' development.yaml


每行后边插入一行
sed '/^ $/d;G' development.yaml


每行后边插入两行
sed '/^ $/d; G; G;' development.yaml


每行前面加行号
sed = development.yaml | sed 'N; s/ / /'


每行前加行号,加制表符
sed = development.yaml | sed 'N; s/ / /'


每行前加行号,加.
sed = development.yaml | sed 'N; s/ /. /'


打印hello 和fine之间的内容
sed -n '/hello/,/fine/p' b.sh
hello world today is fine


打印最后两行
sed '$!N;$!D' development.yaml


打印以及删除最后两行
sed 'N;$!P; $!D; $d' development.yaml

删除特定字符:没有百度出来,替换成空格就可以
sed 's/sudo//g' development.yaml


为文件的每一行后面添加特定字符串
awk '{print $0" &&"}'


将多行文件转换为一行
sed ':a ; N;s/ / / ; t a ; ' file
说明:sed默认只按行处理,N可以让其读入下一行,再对 进行替换,这样就可以将两行并做一行。但是怎么将所有行并作一行呢?可以采用sed的跳转功能。:a 在代码开始处设置一个标记a,在代码执行到结尾处时利用跳转命令t a重新跳转到标号a处,重新执行代码,这样就可以递归的将所有行合并成一行。s表示替换。


实例1:

[root@bogon ~]# cat pip.sh
[root@host-10-1-1-161 ~]# yum remove pip -y
[root@host-10-1-1-161 ~]#cd /usr/local/
[root@host-10-1-1-71 local]# rz pip-18.0.tar.gz
[root@host-10-1-1-71 local]# tar -xf pip-18.0.tar.gz
[root@host-10-1-1-71 local]# cd pip-18.0/
[root@host-10-1-1-71 pip-18.0]# python setup.py install

[root@bogon ~]# cat pip.sh | awk -F'#' '{ print $2 }' | awk '{print $0" &&"}' > output.txt && sed -i ':a ; N;s/ / / ; t a ; ' output.txt && cat output.txt
yum remove pip -y && cd /usr/local/ && rz pip-18.0.tar.gz && tar -xf pip-18.0.tar.gz && cd pip-18.0/ && python setup.py install &&


实例2

cat pip.sh
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pillow
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple beautifulsoup4
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymysql
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple HTMLParser
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pymongo

sed -i 's/sudo//g' pip.sh | cat pip.sh | awk '{print $0 " &&"}' > pip_output.sh && sed -i ':a ; N;s/ / / ; t a ;' pip_output.sh

实例3

[root@oracledb ~]# cat user.txt
[root@oracledb ~]# groupadd -g 200 oinstall
[root@oracledb ~]# groupadd -g 201 dba
[root@oracledb ~]# useradd -u 440 -g oinstall -G dba -d /home/oracle oracle
[root@oracledb ~]# passwd oracle


[root@oracledb ~]# cat user.txt | cut -d ' ' -f 3- | awk '{print $0" &&"}' | sed ':a ; N;s/ / / ; t a ; ' | awk '{for (i=1;i<=NF-1;i++)printf("%s ", $i);print ""}'
groupadd -g 200 oinstall && groupadd -g 201 dba && useradd -u 440 -g oinstall -G dba -d /home/oracle oracle && passwd oracle

原文地址:https://www.cnblogs.com/effortsing/p/9981673.html