sed 文本流編輯的 行編輯器正則表達式
hold space :保持空間。倉庫,半成品centos
一次從文件中讀取一行,放到本身編輯的內存緩衝空間即模式空間,不會編輯原文件;根據所給定的命令在模式空間中作編輯處理,處理結果默認輸出到顯示屏bash
sed [OPTION]... {script-only-if-no-other-script} [input-file]...app
經常使用選項:編輯器
-n :不輸出模式空間中的內容至屏幕spa
-e : 多點編輯 一個sed中實現多個編輯操做3d
-f :/PATH/TO/SCRIPT_FILE :從指定文件中讀取編輯腳本code
-r :支持使用擴展表達式,默認exprblog
-i :原處編輯即修改原文件 注慎用先備份token
1、地址定界:
a) 不給地址:對全文進行處理
# sed 'd' /etc/passwd
b) 單地址:
# : 指定的行
sed '5d' /etc/passwd
/pattern/ :被此處模式所可以匹配到的每一行
sed '/^#/d' /etc/fstab
c) 地址範圍:
d) $ (^$ 、^[[:space:]]*$)
刪除某文件中的空行 sed '/^$/d' /tmp/fstab 刪除某文件中空白行 sed '/^[[:space:]]*$/d' /tmp/fstab
e) ! 表示方法:地址定界! 取反條件
刪除地址界定的行 sed '/^UUID/d' /etc/fstab 刪除非地址界定的行 sed '/^UUID/!d' /etc/fstab
f) ~ 步進
奇數行 sed -n '1~2p' /tmp/fstab sed '2~2p' /tmp/fstab 偶數行 sed -n '2~2p' /tmp/fstab sed '1~2p' /tmp/fstab
2、編輯命令:
d : 刪除範圍內的行
刪除地址範圍內的行 sed '/^UUID/d' /tmp/fstab sed '1.3d' /tmp/fstab
p : 打印當前模式空間中的內容
sed 'p' /tmp/fstab 每一行會顯示2遍,由於sed默認打印模式空間中的內容,符合條件的內容又打印一遍。 sed -n 'p' /tmp/fstab
僅顯示符合條件的行
sed -n '/^UUID/p' /tmp/fstab sed -n '1p' /tmp/fstab
a \'text' 在地址界定行的下一行追加(append)文本
支持換行追加:\n
在某文件第一行以後添加 sed '1a \hello ' /tmp/fstab 在某文件的1到3行每一行追加文本 sed '1,3a \hello ' /tmp/fstab [root@localhost tmp]# sed -n '/^UUID/a \hello \nHow are you ? ' /tmp/fstab hello How are you ?
i \'text' 在地址界定行的上一行插入(insert)文本
支持換行插入:\n
在某文件第一行之上插入 sed '1i \hello ' /tmp/fstab 在某文件的1到3行每一行摻入文本 sed '1,3i \hello ' /tmp/fstab [root@localhost tmp]# sed -n '/^UUID/i \hello \nHow are you ? ' /tmp/fstab hello How are you ?
c \'text' 在地址界定的行 替換爲text
支持換行替換:\n
替換某文件第一行 sed '1c \hello ' /tmp/fstab 替換某文件的1到3行,爲指定的text sed '1,3c \hello ' /tmp/fstab [root@localhost tmp]# sed -n '/^UUID/c \hello \nHow are you ? ' /tmp/fstab hello How are you ?
w /PATH/TO/SOMEFIE 將地址界定的行,保存至/PATH/TO/SOMEFIE中
sed '/^UUID/w /tmp/a.txt ' /tmp/fstab
sed -n '/^UUID/p' /etc/fstab > b.txt
r /path/to/somefile :讀取指定文件的文本流至模式空間中匹配到的行的行後
將某文件中的內容插入至指定文件中
sed '/^UUID/r /etc/issue' /etc/fstab
sed '1,3r /etc/centos-release' /etc/issue #多行插入文本時,在其後插入
= :爲模式空間中的行打印行號
編號:在匹配到的行,上面編號 sed '/^UUID/=' /tmp/fstab sed '=' /tmp/fstab
s/// : 支持使用其它分隔符,或使用s@@@ 、s### 、s||| 、s,,
替換標記 :
g 全局替換
p : 顯示替換成功的行
w /PATH/TO/SOMEFILE : 將替換成功的結果保存至指定文件中
i : 忽略pattern的字符大小寫
sed -n 's/r..t/&er/p' /etc/passwd #此處「&」表明引用前面的「r..t」
# sed 's,,,w /PATH/TO/SOMEFILE' FILE # sed 's,,,' FILE > /PTH/TO/SOMEFILE
[root@localhost bin]# head -n 1 < /etc/passwd | sed 's,rOOt,ROOT,gi' ROOT:x:0:0:ROOT:/ROOT:/bin/bash
向後引用:
正則表達式引擎將 括號中模式匹配到的內容 記錄至內置特殊變量中 \1 \2 \3 ....
s/([a-z]*([^/]+))
\1 此處例子表明[a-z]*[^/]+ 所匹配到內容
\2 [^/]+ 所匹配到的內容
基本正則表達式:\(\)
擴展正則表達式:()
練習1:刪除/boot/grub/grub.conf文本中全部以空白開頭的行行首的空白字符
sed 's@^[[:space:]]\+@@' /tmp/grub.conf CentOS 7: # cp /etc/grub2.cfg /tmp/grub2.cfg # sed -i 's,^[[:space:]]\+,,' /tmp/grub2.cfg
練習2:刪除/etc/fstab文件中全部以#開頭,後面至少跟一個空白字符的行的行首的#和空白字符
sed 's@^#[[:space:]]\+@@' /tmp/fstab sed -i -r 's|^#[[:space:]]+||' /tmp/fstab
練習3:echo 一個絕對路徑給sed命令:取出其基名,取出目錄名
目錄
echo /etc/fstab | sed 's@[^/]\+/\?$@@'
基名
echo /etc/fstab | sed -r 's@(.*/)@@'
[root@localhost tmp]# echo /etc/fstab | sed -r 's@(.*/)([^/]+$)@\2@'
3、高級編輯命令:(不經常使用)
模式空間(pattern) 保持空間(hold space)
注:保持空間不會作任何處理
------》to hold
h :把模式空間中的內容覆蓋至保持空間中;
H:把模式空間中的內容追加至保持空間中;
get《-----
g :從保持空間取出數據覆蓋至模式空間;
G :從保持空間取出內容追加至模式空間;
x <----->將模式空間中的內容與保持空間的中內容進行互換
n 匹配到的行 在處理時,將其下一行覆蓋至模式空間中
N 匹配到的行 在處理時,將其下一行追加至pattern
d 匹配到的行 處理時,刪除模式空間中的單行;
D 刪除多行模式空間中的多行
sed -n 'n,p' FILE 顯示偶數行 sed 'n;d' FILE 顯示奇數行
tac FILE 逆向顯示文件內容
sed '1!G;h;$!d' FILE 逆向顯示文件內容 sed -n '1!G;h;$p' FILE
sed '$!N;$!D' FILE <==> tail -2 FILE 顯示文件最後兩行
sed '$!d' FILE 取出文件最後一行
每一行後添加一個空白行
sed 'G' FILE sed 'a\ ' '' FILE
sed 'g' FILE 所有替換爲空白行
sed '/^$/d;G' FILE 刪除多個空白行,在每一個行後添加一個空白行