sed - 简介 读取编辑文字档的好工具

sed

sed (Stream Editor), 相较於之前的grep、awk都比较篇查找排版工具, sed则是输出与修改工具.
跟awk一样也是以为逐笔进行的方式.

也是能分析日志与文件, 但更多都是修改配置文件用.
针对文件的行做替换; 或者对字串做替换取得.
但sed本身改变的不是原来的文件内容, 而是pattern space内的, 除非重新定向至原档案做输出.

sed 工作流程

跟awk很像, 只是sed先把资料读取进pattern space一个缓冲区空间.
其实还有另一个hold space後面再补充.
pattern space并不会主动被清空,
而是要透过sed的d (delete pattern space)-n这option或是是输出到stdout上时.
每一行读取出来要放到pattern space时, 都会把末端的\n给去掉, 再放到pattern space内.
https://ithelp.ithome.com.tw/upload/images/20210914/20104930a8Akeh0904.png

sed 格式

# 命令行格式
sed [option] "pattern command" file(s)
# 脚本格式
sed [option] -f scriptName file(s)
#  管道格式
stdout | sed [option] "pattern command"

格式其实跟awk、grep雷同, 要就读取档案, 不然就是从管线读取

简单案例

pattern这里大部分也都还是/Regex/, 後面接着p(print) command
先展示没有pattern只有command的时候

sed 'p' python.txt

https://ithelp.ithome.com.tw/upload/images/20210915/20104930K9pNBz7t4H.png
sed预设是会把读取到的每行文字跟匹配到的行内容, 都做输出;
因为没有pattern做匹配, 等於就全部都匹配到了.

因为sed预设是会把patern space的每一行也输出,
搭配-n(slient), 就不会把pattern space的内容做输出.
但後面的command是p所以只要pattern匹配到的行内容还是会做输出.

sed -n 'p' python.txt

https://ithelp.ithome.com.tw/upload/images/20210915/20104930MK8VPAP9Qw.png

新增针对Python字串做匹配

sed -n '/Python/p' python.txt

https://ithelp.ithome.com.tw/upload/images/20210915/20104930NMaQs1aq3z.png

如果pattern command写得很长, 也能把pattern command写在档案内, 透过-f来执行调用

# 准备sed命令档案
cat > edit.sed <<EOF         
/Python/p
EOF

sed -n -f edit.sed python.txt

得到跟上图一样的结果

sed预设只会针对1组pattern command做操作
如果需要针对多组pattern command做操作, 需要搭配-e(add script to be excuted)
在每组pattern command前加上-e

sed -n -e '/cat/p' -e '/bat/p' python.txt
>cat
>bat

上组操作, 好像能搭配Regex的or来匹配多组字串

sed -n '/cat|bat/p' python.txt

按下去, 啥都没有显示???
sed其实跟grep很像, 默认不吃Regex的一些符号, 此时需要搭配-r

sed -n -r '/cat|bat/p' python.txt
>cat
>bat

sed最重要的编辑功能呢? 别急!
这里pattern前面有个s, 就是搜寻并取代的意思, 搜寻/目标对象/取代对象/
多个command中间要用;隔开

sed -n 's/Python/Go/g;p' python.txt

https://i.imgur.com/AxGWef3.png

但会发现python.txt还是原来的内容阿??? 黑人问号!
回到一开始sed的特性, sed预设不修改原来档案, 只是在pattern space内做操作并输出

如果想修改需要搭配-i(edit file in place)

sed -i 's/Python/Go/g' python.txt 

https://ithelp.ithome.com.tw/upload/images/20210915/201049302gTX6Zycs2.png

试想看看, 要是有一组设定档, 需要同时对${client_host}这样的设定, 在不同环境做修改时,
sed是很方便的工具, 且基本上Linux发行版本上预设都有安装.
或者使用envsubst会更为方便


<<:  虹语岚访仲夏夜-10(专业的小四篇)

>>:  【Day11】数据展示元件 - Badge

Day01 - 目前才看到第三章 Object

this&Object Prototype Ch3 Object 我的天,真的太久没翻你,试...

[ 卡卡 DAY 16 ] - React Native Animated 入门 + useNativeDriver 好棒棒

React Native 提供了 Animated 及 LayoutAnimation API 给...

(Day1)执行环境与执行堆叠

执行环境 (Execution context) 在 JS 世界中执行环境是根据不同 functio...

[Python]回归模型01─运用OLS做回归

Hi! 大家好,我是Eric,这次要来用Python做回归模型。 缘起:回归模型是常见的分析方法,...

Day 15:专案02 - PTT C_Chat版爬虫02 | BeautifulSoup

大家安安,欢迎来到铁人赛的第15天! 不知不觉已经过完一半了,再努力坚持下去吧! 昨天已经将网站的原...