shell中sed命令详解
1. sed ⼯作模式
sed(Stream Editor) 流编辑器。对标准输出或⽂件逐⾏进⾏处理
第⼀种:stdout | sed [option] "pattern command"
第⼆种:sed [option] "pattern command" file
2. sed选项
选项含义
-n只打印模式匹配⾏
-e直接在命令⾏进⾏sed编辑,默认选项
-f将sed编辑动作保存到⽂件中,⽤-f指定这个编辑命令所在的⽂件
-r⽀持扩展正则表达式
-
i直接修改⽂件内容
# ⽂件内容
# I love python
# I love PYTHON
# I love java
# I love Hadoop
# I love go
$ sed 'p' # 此处的 p 为⼀个命令表⽰打印输⼊,此处没有匹配模式,表⽰处理所有的⽂件内容,将原⾏也进⾏了输出I love python
I love python
I love PYTHON
I love PYTHON
I love java
I love java
I love Hadoop
I love Hadoop
I love go
I love go
$ sed -n 'p' # 只打印匹配的⾏,原来⽂件中的⾏不进⾏打印输⼊,默认⽂件的原⾏信息都进⾏打印
I love python
I love PYTHON
I love java
I love Hadoop
I love go
$ sed '/python/p' # 这样打印匹配到的python,同时把原⾏信息也进⾏了打印
# 说明, python 匹配到了,所有输出完原⾏信息后,⼜输出了⼀遍匹配到的⾏,其他的没匹配到,将原⾏直接输⼊
I love python
I love python
I love PYTHON
I love java
I love Hadoop
I love go
$ sed -n '/python/p' # 加⼊-n 选项后,只打印匹配到的⾏,此处只有⼀个匹配模式-e可以省略
I love python
$ sed -n -e '/python/p' -e '/PYTHON/p' # -e选项是默认的,但有多个匹配模式的时候,必须写上
I love python
I love PYTHON
# -f 指定编辑模式命令所在⽂件
$ vim edit.sed # 新建⽂件并写⼊内容 /python/p
/python/p
$ sed -n -f edit.
I love python
# -r 扩展正则表达式
$ sed -n -r '/python|PYTHON/p'
I love python
I love PYTHON
# -i 直接修改⽂件内容
vim命令进入编辑模式$ sed -n 's/love/LOVE/g;p' # 此处使⽤了 2个命令 g 和 p,但此时没有修改原⽂件,需要修改原⽂件使⽤ -i
I LOVE python
I LOVE PYTHON
I LOVE java
I LOVE Hadoop
I LOVE go
$ sed -i 's/love/LOVE/g;p' # 将原来的⽂件中love修改成⼤写的LOVE
# 如果使⽤的是苹果的macos系统,就是在-i指令后⾯多加⼀个''空格即可
# sed -i '' 's/love/LOVE/g'
$ # ⽂件全部替换成功
I LOVE python
I LOVE PYTHON
I LOVE java
I LOVE Hadoop
I LOVE go
3. sed中的pattern
匹配模式含义
10command第10⾏进⾏匹配,其余⾏不进⾏匹配
10,20command从第10⾏开始(含),到第20⾏结束(含)
10,+5command从第10⾏开始(含),到15⾏结束(含),除了第10⾏外再加5⾏进⾏匹配/pattern/command进⾏pattern匹配,实际⼯作中⽤的最多
/pattern1/,/pattern2/command匹配从pattern1的⾏开始,到匹配到pattern2的⾏结束
10,/pattern2/command匹配从第10⾏开始,到匹配到pattern2的⾏结束
/pattern/,10command匹配从pattern1的⾏开始,到第10⾏结束
# 还是前⾯的
$ sed -n '3p' # 打印输出第三⾏
I LOVE java
$ sed -n '2,4p' # 打印输出第2⾏开始,第4⾏结束
I LOVE PYTHON
I LOVE java
I LOVE Hadoop
$ sed -n '2,+2p' # 从第2⾏开始,往后加2⾏
I LOVE PYTHON
I LOVE java
I LOVE Hadoop
# 有特殊字符需要转译
$ sed -n '/\/var\/empty/p' /etc/passwd # 匹配 /var/empty 但是包含 / 需要进⾏转译
$ sed -n '/^root/p' /etc/passwd # 匹配以 root开头的⾏
$ sed -n '/^root/p' /etc/passwd # 匹配以 root开头的⾏
$ sed -n '/^root/,/^_www/p' /etc/passwd # 匹配开始以root开头的⾏,到以_www开头的⾏进⾏结束
$ sed -n '11,/^_www/p' /etc/passwd # 从第11⾏开始匹配(包含),到以_www开头的⾏进⾏结束(包含)
4. sed的编辑命令
类别编辑命令含义
查询p打印
增加a⾏后追加
增加i⾏前追加
增加r外表⽂件读⼊,⾏后追加
增加w匹配⾏写⼊外部⽂件,将匹配的⽂件写⼊到新⽂件
删除d删除匹配到⾏
修改s/old/new/=只显⽰匹配到的⾏号
修改s/old/new/将⾏内第⼀个old替换成new,⼀⾏中出现多个匹配,只替换第⼀个
修改s/old/new/g将匹配到的全部的old替换成new
修改s/old/new/2g将⾏内第2个开始的后所有的old替换成new
修改s/old/new/ig将⾏内old全部替换成new,忽略⼤⼩写
修改s/old/new/2表⽰将匹配到的⾏中的第⼆个old替换成new,第⼆个匹配到的进⾏替换
# 拷贝⼀份 passwd ⽂件进⾏操作,千万不要操作 /etc/passwd ⽂件
# 删除
$ sed '1d' passwd # 删除1⾏但只是打印输出了,不会对原⽂件进⾏操作
$ sed -i '1,10d' passwd # 删除从第1⾏到第10⾏并保存 -i 对原⽂件操作
# 苹果系统 sed -i '' '1,10d' passwd
# a ⾏后追加的模式 append
$ sed -i '/\bin\bash/a this is new line' passwd # 匹配 /bin/bash的⾏,并在匹配到的⾏后添加⼀⾏ this is new line
# i ⾏前追加的模式 insert
$ sed -i '/\bin\bash/i this is new line' passwd # 匹配 /bin/bash的⾏,并在匹配到的⾏前添加⼀⾏ this is new line
# r 从⽂件读取内容然后⾏后追加 read r后⾯可以是绝对路径也可以是相对路径
$ sed -i '/\bin\bash/' passwd
# w 将匹配到的内容写⼊到另外的⽂件中 write 保存到 /tmp路径下的
$ sed -i '/\bin\bash/w /' passwd
# 现在有这么个⽂件, python 其中两个单词写错了,需要修改
$
I LOVE python
I pyxxon PYTHON pyxaon
I LOVE java pycaon
HADddP HADOOP
## .. 代表2个任意的字符
$ sed -i '/python/g'
# macos 下 sed -i '' '/python/g'
$
I LOVE python
I python PYTHON python
I LOVE java python
HADddP HADOOP
# 反向引⽤,引⽤匹配到的内容还是这个⽂件,将py**on 这样的字符后⾯加上[hello]这个字符串
$
I LOVE python
I pyxxon PYTHON pyxaon
I LOVE java pycaon
# 反向引⽤ & 这个代表匹配到的内容也可以使⽤ \1 & 代表所有的匹配内容 \1 只是匹配括号内容的引⽤# & 代表匹配到的所有内容 \1 需要加上括号只是匹配括号内容的引⽤
$ sed -i '/&hello/g'
# macos sed -i '' '/&hello/g'
I LOVE pythonhello
I pyxxonhello PYTHON pyxaonhello
I LOVE java pycaonhello
# 括号也需要转译
$ sed -i 's/\(py..on\)/\1hello/g'
# 反向引⽤⽰例将原来加⼊hello的⽂件进⾏处理
$ sed -i 's/\(py\)........./\1thon/g'
$
I LOVE python
I python PYTHON python
I LOVE java python
# 双引号,当模式总需要引⼊外⾯定义的变量的时候,需要使⽤双引号
$ VAR1=python
$ VAR2=nodejs
$ sed -i "s/$VAR1/$VAR2/g"
# 如果还是使⽤单引号需要把变量引⽤也⽤单引号包围,建议直接使⽤双引号
$ sed -i 's/'$VAR1'/'$VAR2'/g'
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论