linux sed 替换

哎,你问sed啊,这玩意儿确实挺强大的,我用过不少。
上周有个客人问我怎么用sed批量处理日志文件,我就顺手跟他讲了讲。

首先说说你说的这个替换行尾的.成!。
这个操作用sed的话,可以写成这样:
bash sed -i 's/.$/!/g' regular_express.txt
你看,s/.$/!/g这里面:
. 表示行尾的任意字符(这里是.本身)
! 是你要替换成的新字符
g 是全局替换的意思,如果一行有多个.,都会被替换成!
执行完这个命令后,regular_express.txt里每一行结尾的.都会变成!。
简单吧?
然后你说的在最后一行加Thisisatest。
这个其实更简单,用sed的话:
bash sed -i '$a Thisisatest' regular_express.txt
这行命令里:
$ 表示最后一行
a 是append(追加)的意思
Thisisatest 是你要追加的文本
执行后,文件最后一行就会变成Thisisatest。
我之前在服务器上维护配置文件时经常用这个,比如在crontab文件最后加定时任务特别方便。

至于你说的sed -i选项,这确实是我用得最频繁的sed功能了。
你想想,如果你有个几百万行的日志文件,要在第1 00行加一句注释,用vim的话,光加载文件可能就卡半天,还容易卡死。
但用sed呢?
bash sed -i '1 00i 添加的注释' logfile.log
直接在第1 00行前面插入注释,-i保证直接修改原文件。
这功能真的太实用了,我之前处理过一次几百GB的日志,如果不用sed手动编辑,估计得累死。

然后你列的那些用法,我基本都用过: 1 . 替换第一个出现的字符串:sed -i 's/old/new/1 ' file,只替换每行的第一个old 2 . 替换所有字符串:sed -i 's/old/new/g' file,这就是最常用的全局替换 3 . 去掉行首的@:sed -i 's/^@//g' file,用^表示行首 4 . 在特定字符串前插入:sed -i '/pattern/i new line' file 5 . 在特定字符串后插入:sed -i '/pattern/a new line' file 6 . 删除特定字符串的行:sed -i '/pattern/d' file
这些基本操作我都在用,特别是处理那些带特定标记的配置文件时特别方便。
不过要注意,sed的-i选项默认是原地修改,如果不小心执行了可能会把文件搞坏,最好先备份一下。

你还有什么具体问题吗?比如怎么用sed处理正则表达式比较复杂的场景?我之前遇到过用sed处理XML文件,那会儿真有点头大。

京ICP证03 01 7 3 号-1 京网文【2 02 3 】1 03 4 -02 9 号 ©2 02 6 Baidu
这就是坑。
别信。
别这么干。

linux 替换文件中的路径命令

结论:Vim替换命令不正确,应该是:%s/\/home\/app\/techo\/emm\/\//\/home\/techo\/emm\/\//g,而sed命令是正确的。
Vim语法错误导致替换失败,sed直接在文件中修改,效率更高。