背景:用sed进行删除一行时用@或#均不行,最后还得用斜杠,
sed -i '@^worker_cpu_affinity.*@d' nginx.conf
sed: -e expression #1, char 1: unknown command: `@'
用@符号,即使没有提示啥错误,但实践发现其并没有被替换:
sed -s "s@jenkins@@" /etc/hosts
模糊匹配删一行:
sed -i "/.*bbs.mysql.*/d" /etc/hosts
用斜杠就对了,以行打头进行匹配:
比如删除Nginx里的nginx.conf里的 include vhosts/mini.conf,注意:如果有多个可能会删除多行;
用这个检查后加的|| /usr/sbin/ntpdate 10.70.36.233 && hwclock -w,就行,看看结果
Ansible的crontab模块批量修改:
是否修改成功:
通过vi的%s/$/;/g 来给一个100M的大文件进行替换,vim赶紧很吃力。
于是通过sed来实现该功能,如下:
或者删除某文件以某字符开头的行:
删除Crontab里的ntpdate,测试如下:
下面这样能删除,但是能留下空行:
#Ansible: sync time from ntp server
40 4 * * * /usr/sbin/ntpdate 192.168.105.** || /usr/sbin/ntpdate 10.70.36.***
40 4 * * * /usr/sbin/ntpdate 192.168.105.**
删除步骤:
sed -i 's#^.*\/usr\/sbin\/ntpdate.*$##' /var/spool/cron/root
sed -i '/^$/d' /var/spool/cron/root
先修改,再一个一个干掉多余的比较靠谱稳妥:
ansible-playbook common.yml -t common_crontab_ntpdate -e h=jackX
看下有多少个重复的:
ansible itest -a"cat /var/spool/cron/root|grep 'ntpdate 10.70.36.***'"
=================================================================
一、sed 中的-i参数说明:直接删除文件里某行或某几行后保存回被删除文件,如下:
sed -i '1d' nginx.conf #直接删除文件第1行,删除结果后保存回被删除文件。
想删除最后几行,可以用tac反序输出文件,删除后面3行, 1-3行:
tac nginx.conf | sed '1,3d'|tac > nginxnew.conf #先按行颠倒一下文件内容,再把这个流给用Sed删除掉前3行,也就是原文件后面三行,然后再颠倒还原回去,再保存回新文件,一定要回新文件,否则原文件变空了。
tac :反序输出文件简介。
二、用Sed显示某一行:
111 21
[root@bogon diff]# sed -n '1p' A.txt
三、用sed来修改某一行的方法:
如有文件sedline.txt 内容如下:
jackxiang
lksjkdfs
xiangdong
xdy108
四、用Sed替换之替换某行里的内容?如:第4行有一个xdy108的串,如何用sed来修改这个xdy为jackcom呢?4s:
sed '4s/xdy/jackcom/' sedline.txt > sendlinemodified.txt
或者直接对该文件做修改:
sed -i '4s/xdy/jackcom/' sedline.txt
-i: 直接将修改这个sedline.txt文件。
模拟替换:-n p参数,这样不会真替换,而是将替换部分显示出来,很是方便测试:
sed -n 's/xdy/jackcom/p' sedline.txt
在某行后插入一行:下面是在第二行后插入SOME_CONTENT_Behind_3rdLine ,并回写回文件中,用到 -i就是这个意思。
sed -i '2 a SOME_CONTENT_Behind_3rdLine' sedline.txt
补充:
在b.txt的第2行之前插入“xxx”
sed '2 i/xxx' b.txt
在b.txt的第2行之后插入“xxx”
sed '2 a/xxx' b.txt
在b.txt的第2行和第3行之后插入“xxx”
sed '2,3 a/xxx' b.txt
在b.txt的第2行和第3行之前插入“xxx”
sed '2,3 i/xxx' b.txt
在b.txt的第2行至最后一行之前插入“xxx”
sed '2,$ i/xxx' b.txt
总结
在指定行之前插入使用的是“i”,而在指定行之后插入是使用“a”
sed -i '@^worker_cpu_affinity.*@d' nginx.conf
sed: -e expression #1, char 1: unknown command: `@'
用@符号,即使没有提示啥错误,但实践发现其并没有被替换:
sed -s "s@jenkins@@" /etc/hosts
模糊匹配删一行:
sed -i "/.*bbs.mysql.*/d" /etc/hosts
用斜杠就对了,以行打头进行匹配:
比如删除Nginx里的nginx.conf里的 include vhosts/mini.conf,注意:如果有多个可能会删除多行;
用这个检查后加的|| /usr/sbin/ntpdate 10.70.36.233 && hwclock -w,就行,看看结果
Ansible的crontab模块批量修改:
是否修改成功:
通过vi的%s/$/;/g 来给一个100M的大文件进行替换,vim赶紧很吃力。
于是通过sed来实现该功能,如下:
sed -i "s/$/;/g" sqlcheckout.sql
或者删除某文件以某字符开头的行:
sed '/^FScoreDetailId/d' sqlcheckoutResultTestResult.txt
删除Crontab里的ntpdate,测试如下:
下面这样能删除,但是能留下空行:
#Ansible: sync time from ntp server
40 4 * * * /usr/sbin/ntpdate 192.168.105.** || /usr/sbin/ntpdate 10.70.36.***
40 4 * * * /usr/sbin/ntpdate 192.168.105.**
删除步骤:
sed -i 's#^.*\/usr\/sbin\/ntpdate.*$##' /var/spool/cron/root
sed -i '/^$/d' /var/spool/cron/root
先修改,再一个一个干掉多余的比较靠谱稳妥:
ansible-playbook common.yml -t common_crontab_ntpdate -e h=jackX
看下有多少个重复的:
ansible itest -a"cat /var/spool/cron/root|grep 'ntpdate 10.70.36.***'"
=================================================================
一、sed 中的-i参数说明:直接删除文件里某行或某几行后保存回被删除文件,如下:
sed -i '1d' nginx.conf #直接删除文件第1行,删除结果后保存回被删除文件。
想删除最后几行,可以用tac反序输出文件,删除后面3行, 1-3行:
tac nginx.conf | sed '1,3d'|tac > nginxnew.conf #先按行颠倒一下文件内容,再把这个流给用Sed删除掉前3行,也就是原文件后面三行,然后再颠倒还原回去,再保存回新文件,一定要回新文件,否则原文件变空了。
tac :反序输出文件简介。
二、用Sed显示某一行:
[root@bogon diff]# sed -n '1p' A.txt
111 21
[root@bogon diff]# sed -n '1p' A.txt
三、用sed来修改某一行的方法:
如有文件sedline.txt 内容如下:
jackxiang
lksjkdfs
xiangdong
xdy108
四、用Sed替换之替换某行里的内容?如:第4行有一个xdy108的串,如何用sed来修改这个xdy为jackcom呢?4s:
sed '4s/xdy/jackcom/' sedline.txt > sendlinemodified.txt
或者直接对该文件做修改:
sed -i '4s/xdy/jackcom/' sedline.txt
-i: 直接将修改这个sedline.txt文件。
模拟替换:-n p参数,这样不会真替换,而是将替换部分显示出来,很是方便测试:
sed -n 's/xdy/jackcom/p' sedline.txt
在某行后插入一行:下面是在第二行后插入SOME_CONTENT_Behind_3rdLine ,并回写回文件中,用到 -i就是这个意思。
sed -i '2 a SOME_CONTENT_Behind_3rdLine' sedline.txt
补充:
在b.txt的第2行之前插入“xxx”
sed '2 i/xxx' b.txt
在b.txt的第2行之后插入“xxx”
sed '2 a/xxx' b.txt
在b.txt的第2行和第3行之后插入“xxx”
sed '2,3 a/xxx' b.txt
在b.txt的第2行和第3行之前插入“xxx”
sed '2,3 i/xxx' b.txt
在b.txt的第2行至最后一行之前插入“xxx”
sed '2,$ i/xxx' b.txt
总结
在指定行之前插入使用的是“i”,而在指定行之后插入是使用“a”
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/3991/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2019-7-22 13:37
评论列表