sed命令:Stream EDitor 流編輯器
sed命令的工作流程:
sed會復制原文件中的一行或者多行,逐行進行操作。首先會將該行的內容放入到模式空間內,在模式空間內進行定界或者正則表達式匹配操作。
a.如果該行內容不符合正則表達式或定界,該內容則被判斷為No,進行標準輸出。
b.如果該行內容符合正則表達式或定界,該內容則被判斷為Yes,進行編輯(包括標準輸出)。
sed中模式空間和保持空間中的內容會進行會換,這種會換會使文件內容進行多次的篩選編輯,完成復雜的任務。
一般情況下,sed是不會改變原文件的內容,如果需要,可以加-i參數改變原文件的內容。(改變文件內容前最好將原文件進行變名的備份)
sed [OPTION] … 'script' [input-file]…
script:地址定界編輯命令
常用選項:
-n:不輸出模式空間中的內容至屏幕
-e:實現多點編輯
-f /PATH/TO/SED_SCRIPT_FILE:每行一個編輯命令
-r:支持使用擴展正則表達式
-i:直接編輯原文件
地址定界:
-
不給地址:對全文進行處理(空地址)
-
單地址:
#:指定行
/pattern/:被此模式所匹配到的每一行
-
地址范圍:
#,#:以第幾行到第幾行
#,/pattern/:從指定的行開始到第1個pattern匹配到的行
/par1/,/par2/:從第1個par匹配到的行到第2個par匹配到的行
$:最后一行
-
步進地址:~
1~2:所有奇數行
2~2:所有偶數行
編輯命令:
d:刪除 例:sed ‘1,5d’ /etc/fstab 把fstab文件中的第1到第5行刪除
p:顯示模式空間中的內容
a \text :在行后面追加文本“text”,支持\n實現多行追加
i \text :在行前面插入文本“text”,
例:
[root@localhost ~]# sed '3i \newline' /etc/fstab #在第3行前面插入newline
#
newline
# /etc/fstab
# Created by anaconda on Tue Jul 19 18:09:10 2016
[root@localhost ~]# sed '3i \newline\nthis is anther line' /etc/fstab #支持\n
#
newline
this is anther line
# /etc/fstab
c \text :把匹配到的行替換為此處指定的文本"text"
例:
[root@localhost ~]# sed '/^UUID/c \#new line' /etc/fstab #將所有UUID開頭的行替換 為new line
#
# /etc/fstab
# Created by anaconda on Tue Jul 19 18:09:10 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
#new line
#new line
#new line
#new line
tmpfs /dev/shm tmpfs defaults 0 0
w /PATH/TO/SOMEFILE/:保存模式空間匹配到的行至指定的文件中
例:
[root@localhost ~]# sed '/^[^#]/w /tmp/fstab.new' /etc/fstab #將非#開頭的行保存 到/tmp/fstab.new中
[root@localhost ~]# cat /tmp/fstab.new
UUID=d805bcfe-f510-4569-8bb8-3eed373118ea / ext4 defaults 1 1
UUID=150c09c2-f004-4878-985b-be8f475c60ee /boot ext4 defaults 1 2
UUID=768a541e-43c9-446a-a84e-fd0a2edc9437 /testdir ext4 defaults 1 2
UUID=95011402-df68-4950-8584-23826c8d3a79 swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
r /PATH/FROM/SOMEFILE :讀取指定文件的內容到當前文件被模式匹配到的行的行后面,實現文件合并
例:
[root@localhost ~]# sed '/UUID/r /etc/issue' /etc/fstab #在所有UUID開頭的行后面插 入/etc/issue文件內容
#
# /etc/fstab
# Created by anaconda on Tue Jul 19 18:09:10 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=d805bcfe-f510-4569-8bb8-3eed373118ea / ext4 defaults 1 1
CentOS release 6.8 (Final)
Kernel \r on an \m
UUID=150c09c2-f004-4878-985b-be8f475c60ee /boot ext4 defaults 1 2
CentOS release 6.8 (Final)
Kernel \r on an \m
UUID=768a541e-43c9-446a-a84e-fd0a2edc9437 /testdir ext4 defaults 1 2
CentOS release 6.8 (Final)
Kernel \r on an \m
UUID=95011402-df68-4950-8584-23826c8d3a79 swap swap defaults 0 0
CentOS release 6.8 (Final)
Kernel \r on an \m
tmpfs /dev/shm tmpfs defaults 0 0
= :為模式匹配到的行打印行號
! :條件取反 (地址定界!編輯命令)
例:
[root@localhost ~]# sed '/^#/!d' /etc/fstab #刪除fstab文件中不以#開頭的行
#
# /etc/fstab
# Created by anaconda on Tue Jul 19 18:09:10 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
[root@localhost ~]#
s/// :查找替換,其分隔符可自行制定,常用的有s@@@,s###等。
替換標記:
g :全局替換
w :將替換成功的結果保存到指定的文件中
p :顯示替換成功的行
例:
刪除/boot/grwb/grub2.cfg文件中所有以空白字符開頭的行的行首的所有空白字符
sed 's@^[[:space:]]\+@@' /etc/grub2.cfg #該/etc/grub2.cfg文件在linux7系統上
刪除/etc/fstab文件中所有以#開頭的行的行首的#及#后面的所有空白字符
[root@localhost ~]# sed 's@^#[[:space:]]*@@' /etc/fstab
輸出一個絕對路徑給sed命令,取出其目錄,其行為類似于dirname
[root@localhost ~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
/var/log/
高級編輯命令:
h :把模式空間中的內容覆蓋至保持空間中
H :把模式空間中的內容追加至保持空間尾部
g :把保持空間中的內容覆蓋至模式空間中
G :把保持空間中的內容追加至模式空間尾部
x :把模式空間中內容與保持空間中內容互換
n :覆蓋讀取匹配到的行下一行至模式空間中(覆蓋原行)
N :追加讀取匹配到的行下一行至模式空間中
d :刪除模式空間中的行
D :刪除多行模式空間中的所有行
例:
[root@localhost ~]# sed -n 'n;p' /etc/fstab #顯示偶數行
#
# Created by anaconda on Fri Jul 8 21:17:42 2016
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#
UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot xfs defaults 0 0
[root@localhost ~]# sed '$!d' /etc/fstab #取出最后一行
/dev/mapper/rhel-swap swap swap defaults 0 0
[root@localhost ~]# sed '$!N;$!D' /etc/fstab #取出最后兩行
UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
[root@localhost ~]# sed '/^$/d;G' /etc/fstab #刪除原有的所有空白行,而后為所有的 非空白行后添加一個空白行
#
# /etc/fstab
# Created by anaconda on Fri Jul 8 21:17:42 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
[root@localhost ~]# sed 'n;d' /etc/fstab #顯示奇數行
# /etc/fstab
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/rhel-root / xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
[root@localhost ~]# sed 'G' /etc/fstab #在每一行后面添加空白行
#
# /etc/fstab
# Created by anaconda on Fri Jul 8 21:17:42 2016
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=07a0c0c3-47db-4cc9-95e5-e5c7d415c126 /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
原創文章,作者:zebra930,如若轉載,請注明出處:http://www.www58058.com/31060
文章寫的很詳細,從原理到常見用法總結的很棒,有理論有操作。