sed (Stream Editor), 相较於之前的grep、awk都比较篇查找排版工具, sed则是输出与修改工具.
跟awk一样也是以行
为逐笔进行的方式.
也是能分析日志与文件, 但更多都是修改配置文件用.
针对文件的行做增
、删
、替换
; 或者对字串做替换
或取得
.
但sed本身改变的不是原来的文件内容, 而是pattern space内的, 除非重新定向至原档案
做输出.
跟awk很像, 只是sed先把资料读取进pattern space
一个缓冲区空间.
其实还有另一个hold space
後面再补充.
pattern space并不会主动被清空,
而是要透过sed的d (delete pattern space)
或-n
这option或是是输出到stdout上时.
每一行读取出来要放到pattern space时, 都会把末端的\n
给去掉, 再放到pattern space内.
# 命令行格式
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
sed预设是会把读取到的每行文字跟匹配到的行内容, 都做输出;
因为没有pattern做匹配, 等於就全部都匹配到了.
因为sed预设是会把patern space的每一行也输出,
搭配-n
(slient), 就不会把pattern space的内容做输出.
但後面的command是p
所以只要pattern匹配到的行内容还是会做输出.
sed -n 'p' python.txt
新增针对Python字串做匹配
sed -n '/Python/p' python.txt
如果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
但会发现python.txt还是原来的内容阿??? 黑人问号!
回到一开始sed的特性, sed预设不修改原来档案, 只是在pattern space内做操作并输出
如果想修改需要搭配-i
(edit file in place)
sed -i 's/Python/Go/g' python.txt
试想看看, 要是有一组设定档, 需要同时对${client_host}
这样的设定, 在不同环境做修改时,
sed是很方便的工具, 且基本上Linux发行版本上预设都有安装.
或者使用envsubst会更为方便
this&Object Prototype Ch3 Object 我的天,真的太久没翻你,试...
React Native 提供了 Animated 及 LayoutAnimation API 给...
执行环境 (Execution context) 在 JS 世界中执行环境是根据不同 functio...
Hi! 大家好,我是Eric,这次要来用Python做回归模型。 缘起:回归模型是常见的分析方法,...
大家安安,欢迎来到铁人赛的第15天! 不知不觉已经过完一半了,再努力坚持下去吧! 昨天已经将网站的原...