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 直接修改文件內容
# demo.txt 文件內容
# I love python
# I love PYTHON
# I love java
# I love Hadoop
# I love go

$ sed 'p' demo.txt  # 此處的 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' demo.txt # 只打印匹配的行,原來文件中的行不進行打印輸入,默認文件的原行信息都進行打印
I love python
I love PYTHON
I love java
I love Hadoop
I love go
$ sed '/python/p' demo.txt # 這樣打印匹配到的python,同時把原行信息也進行了打印
# 說明, python 匹配到了,所有輸出完原行信息后,又輸出了一遍匹配到的行,其他的沒匹配到,將原行直接輸入
I love python
I love python
I love PYTHON
I love java
I love Hadoop
I love go
$ sed -n '/python/p' demo.txt # 加入-n 選項后,只打印匹配到的行,此處只有一個匹配模式-e可以省略
I love python
$ sed -n -e '/python/p' -e '/PYTHON/p' demo.txt # -e選項是默認的,但有多個匹配模式的時候,必須寫上
I love python
I love PYTHON

# -f 指定編輯模式命令所在文件
$ vim edit.sed # 新建文件並寫入內容 /python/p
/python/p
$ sed -n -f edit.sed demo.txt
I love python

# -r 擴展正則表達式
$ sed -n -r '/python|PYTHON/p' demo.txt
I love python
I love PYTHON

# -i 直接修改文件內容
$ sed -n 's/love/LOVE/g;p' demo.txt # 此處使用了 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' demo.txt # 將原來的文件中love修改成大寫的LOVE
# 如果使用的是蘋果的macos系統,就是在-i指令后面多加一個''空格即可
# sed -i '' 's/love/LOVE/g' demo.txt
$ cat demo.txt # 文件全部替換成功
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行結束
# 還是前面的demo.txt
$ sed -n '3p' demo.txt # 打印輸出第三行
I LOVE java
$ sed -n '2,4p' demo.txt # 打印輸出第2行開始,第4行結束
I LOVE PYTHON
I LOVE java
I LOVE Hadoop
$ sed -n '2,+2p' demo.txt # 從第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/r demo.txt' passwd
# w 將匹配到的內容 寫入到另外的文件中 write 保存到 /tmp路徑下的newfile.txt
$ sed -i '/\bin\bash/w /tmp/newfile.txt' passwd

# 現在有這么個文件, python 其中兩個單詞寫錯了,需要修改
$ cat demo.txt 
I LOVE python
I pyxxon PYTHON pyxaon
I LOVE java pycaon
HADddP HADOOP

##  .. 代表2個任意的字符
$ sed -i 's/py..on/python/g' demo.txt
# macos 下 sed -i '' 's/py..on/python/g' demo.txt
$ cat demo.txt
I LOVE python
I python PYTHON python
I LOVE java python
HADddP HADOOP

# 反向引用, 引用匹配到的內容 還是這個文件,將py**on 這樣的字符后面加上[hello]這個字符串
$ cat demo.txt 
I LOVE python
I pyxxon PYTHON pyxaon
I LOVE java pycaon
# 反向引用 & 這個代表匹配到的內容 也可以使用	\1 & 代表所有的匹配內容 \1 只是匹配括號內容的引用
# & 代表匹配到的所有內容 \1 需要加上括號 只是匹配括號內容的引用
$ sed -i 's/py..on/&hello/g' demo.txt
# macos sed -i '' 's/py..on/&hello/g' demo.txt
cat demo.txt
I LOVE pythonhello
I pyxxonhello PYTHON pyxaonhello
I LOVE java pycaonhello
# 括號也需要轉譯 
$ sed -i 's/\(py..on\)/\1hello/g' demo.txt

# 反向引用示例 將原來加入hello的文件進行處理
$ sed -i 's/\(py\)........./\1thon/g' demo.txt
$ cat demo.txt
I LOVE python
I python PYTHON python
I LOVE java python

# 雙引號,當模式總需要引入外面定義的變量的時候,需要使用雙引號
$ VAR1=python
$ VAR2=nodejs
$ sed -i "s/$VAR1/$VAR2/g" demo.txt
# 如果還是使用單引號 需要 把 變量引用也用單引號包圍,建議直接使用雙引號
$ sed -i 's/'$VAR1'/'$VAR2'/g' demo.txt


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM