Stream EDitor ( Blog 6)

文本流編輯器,行編輯器sed詳解

 

sed:GNU Stream EDitor,屬于FSF組織,流編輯器;一次處理一行文本;
特性:類似于一個文本編輯工具;但可以過濾管道中的文本,是那些文本編輯器不具備的功能;

工作模式:
當有
一次讀取一行至模式空間;
不匹配:不操作
匹配;編輯命令操作
顯示模式空間中的所有行;

編輯操作:
操作整行:其它編輯命令;d,c,r,i,w,a …
操作行內:s查找替換

sed [OPTION]… ‘[[start_pos,]end_pos]編輯命令’ [input-file]…
模式空間:非刪除/修改命令,顯示全文;刪除/修改命令僅顯示非dc命令匹配到的行;

OPTION:
-n: 與p命令連用,不顯示模式空間中的行;默認情況sed會打印所有處理過的輸入行;除了c,d命令處理過的輸入;
顯示/etc/fstab中以UUID開頭的行:
[root@localhost ~]# sed -n ‘/^UUID/p’ /etc/fstab

-e script, –expression=script;同時指定多個編輯命令;
刪除/etc/fstab中以UUID開頭的行:并刪除以#開頭的行;
[root@localhost ~]# sed -e ‘/^UUID/d’ -e ‘/^#/d’ /etc/fstab

-f /PATH/TO/SED_SCRIPT_FILE;每行一個script
刪除以#開頭的行
[root@localhost ~]# echo “/^#/d” > myscript
[root@localhost ~]# cat myscript
/^#/d
[root@localhost ~]# sed -f myscript /etc/fstab

-r, –regexp-extended;擴展的正則表達式
輸出一個絕對路徑,取其基名:
[root@localhost ~]# echo “/etc/sysconfig/network-scripts/ifcfg-eno16777736” | sed -r “s,(.*)/([^/]+)$,\2,”
-i[SUFFIX], –in-place[=SUFFIX];編輯原文件;不輸出至標準輸出;

地址定界編輯命令
地址定界:
(1) 空地址;對全文進行處理;全文的范圍:1,$
[root@localhost ~]# sed ‘1,$c\ 123’ /etc/fstab
123
[root@localhost ~]# sed ‘c\ 123’ /etc/fstab
123
123
123
123
123
123
123
123
123
123
123
123
(2) 單地址;
# 指定行
替換指定行:
[root@localhost ~]# sed ‘1c\ 123’ /etc/fstab
/pattern/ 被此模式所匹配到的每一行;
替換模式匹配的每一行;
[root@localhost ~]# sed ‘/^UUID/c\ 123’ /etc/fstab
(3) 地址范圍:
#,#
刪除范圍界定的行:
[root@localhost ~]# sed ‘1,$c\ 123’ /etc/fstab
123
#,+# 相對地址表示法
[root@www ~]# sed ‘1,+3c \123’ a.txt
123
5
6
7
8
[root@www ~]# sed ‘1,3c \123’ a.txt
123
4
5
6
7
8
刪除行范圍界定的行:
[root@localhost ~]# sed ‘1,+5c\ 123’ /etc/fstab <—- 范圍內的行會被刪除;
123
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=5b4e0db2-8c87-4422-9ac5-37142e5cc600 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0

#,/pat1/
[root@www ~]# sed ‘1,/^7/c \123’ a.txt
123
8
/pat1/,/pat2/
[root@www ~]# sed ‘/^1/,/^7/c \123’ a.txt
123
8
(4) 步進: ~
1~2: 所有奇數行;
替換每一行:
[root@www ~]# sed ‘1~2c \123’ a.txt
123
2
123
4
123
6
123
8

2~2: 所有偶數行;
替換每一行:
[root@www ~]# sed ‘2~2c \123’ a.txt
1
123
3
123
5
123
7
123

編輯命令:
d:刪除模式空間中處理的行;
c: 除默認匹配全文之外,表示范圍的連續的行
[root@localhost ~]# sed ‘c\ 123’ /etc/fstab
[root@localhost ~]# sed ‘1,$c\ 123’ /etc/fstab

w FILE : 將匹配的所有行寫入文件中;
[root@localhost ~]# sed ‘1,$w fstab’ /etc/fstab

r FILE : 在匹配的每一行后追加指定文件中的內容;
[root@localhost ~]# sed ‘1,$r fstab’ /etc/fstab

a \text:匹配的每一行后追加 text;
[root@localhost ~]# sed ‘1,$a \fstab’ /etc/fstab

i \text:匹配的每一行前追加 text;
[root@localhost ~]# sed ‘1,$i \fstab’ /etc/fstab

p:打印特定的行;與-n連用
顯示全文:[root@localhost ~]# sed ‘1,$a \fstab’ /etc/fstab
顯示匹配UUID開頭的行:[root@localhost ~]# sed -n ‘/^UUID/p’ /etc/fstab

=:為模式匹配到的行打印行號;
為每一行編號:
為UUID開頭的行編號:
!: 條件取反;在模式后編輯命令之前
刪除非UUID開頭的行:
s///: 查找替換;@@@ ### (編輯行內的信息)
替換標記:
g: 全局替換
w /PATH/TO/SOMEFILE:將替換成功的結果所在行保存至指定文件中;
p: 顯示替換成功的行;

高級編輯命令:
h: 把模式空間中的內容復制一份后,覆蓋至保持空間中;
H:把模式空間中的內容復制一份后,追加至保持空間中;

g: 把保持空間中的內容復制一份后,覆蓋至模式空間中;
G: 把保持空間中的內容復制一份后,追加至模式空間中;

x: 把模式空間中的內容與保持空間中的內容互換;exchange
n: 覆蓋讀取的行的下一行至模式空間;
N:追加讀取的行的下一行至模式空間;
d: 刪除模式空間中的行;
D: 刪除多行模式空間中的第一行;N

練習1:刪除/boot/grub/grub2.cfg文件中所有以空白字符開頭的行的行首的所有空白字符;
~]# sed ‘s,^[[:space:]]\+,,’ /boot/grub/grub.conf
練習2:刪除/etc/fstab文件中所有以#開頭的行的行首的#號及#后面的所有空白字符;
~]# sed ‘s,^#[[:space:]]\+,,’ /etc/fstab
練習3:輸出一個絕對路徑給sed命令,取出其目錄名,其行為類似于dirname
~]# echo “/etc/sysconfig/network-scripts/ifcfg-ens33” | sed ‘s,/$,,’ | sed -r ‘s,(.*)/([^/]+),\1,’

~]# echo “/etc/sysconfig/network-scripts/ifcfg-ens33” | sed ‘s,/$,,’ | sed -r ‘s@[^/]+$@@’
示例:
# sed -n ‘n;p’ FILE 顯示偶數行;sed -n ‘2~2p’ FILE
1:匹配1n,追加后,匹配2p
# sed ‘1!G;h;$!d’ FILE 相當于 tac FILE
# sed ‘$!d’ FILE 相當于 tail -n 1 FILE
# sed ‘$!N;$!D’ FILE 相當于 tail -n 2 FILE
倒數第2行, N, 最后一行不D
# sed ‘/^$/d;G’ FILE ===> sed ‘/^$/d’ -e sed ‘G’ FILE
# sed ‘G’ FILE 原有的每行后方有空白行;
# sed ‘n;d’ FILE 顯示奇數行;===> sed -e ‘n’ -e ‘d’ FILE

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/89047

(0)
逆神陽逆神陽
上一篇 2017-11-27
下一篇 2017-11-27

相關推薦

  • bash 數組和變量

    數組可以把多個變量集合起來,不用再一個個的聲明變量,也可以調多個單個的變量使用,極大方便了我們的使用,而且Linux bash中的數組還支持同一個數組中同時有數字和字符串。下面讓我們來了解一下數組。 一,數組的簡介 變量:存儲單個元素的內存空間 數組:存儲多個元素的連續的內存空間,相當于多個變量的集合。 數組名和索引 索引:編號從0 開始,屬于數值索引 注意…

    Linux干貨 2016-08-24
  • 網絡管理1

    一、知識整理 1、路由轉發:拆除第一層MAC地址,根據IP地址廣播,收到信號后重新封裝。一個路由器連接多個廣播域,一個交換機連接多個沖突域。 2、網絡用戶應用程序:WEB瀏覽器;即時消息;電子郵件;協作(視頻會議,vnc);web網絡服務;文件網絡服務;數據庫服務;中間件服務(Tomcat);安全服務(netfilter)。 3、HDR:報頭。Frame C…

    Linux干貨 2016-09-05
  • 第二周 文件管理

    1.Linux上的文件管理類型命令都有哪些,其常用的使用方法及其相關示例演示 mkdir—— 創建目錄 ?make directory 命令格式——mkdir [OPTION]… DIRECTORY… -p:自動按需創建父目錄; -v:verbose,顯示詳細過程; -m MODE:創建目錄直接給定權限,否則是默認權限; 注意:路徑基…

    2017-12-10
  • 磁盤分區管理與文件系統的創建

    磁盤分區管理與文件系統的創建   不光是linux文件系統,所有的大結構,多數據湊到一塊的時候,單一的管理是沒有能力處理這樣龐大規模的存在的。所謂“君王不下縣”也就是這個道理。要系統的,規范的管理一個國家,存在著省、市這樣的層級結構。linux系統也是這樣,將整個系統劃分為若干個分區,實現不同功能,不同層級的規范管理,這就是創建磁盤分區的意義。既然…

    Linux干貨 2016-09-01
  • LAMP+NFS實現雙web服務負載均衡

        一、實驗拓撲          二、系統環境      1、主機A、主機B、主機C:CentOS 6.5        測試PC:         Windows 7 旗艦…

    Linux干貨 2015-07-06
  • diy自己的linux

    準備一臺liunx的機器,我用的是liunx虛擬機,Centos6.8的鏡像。 單獨加載一塊硬盤,我加載了一塊20G的硬盤,然后用fdisk /dev/sdb進行分區,sdb1用來作為將來系統的/boot分區,所有100M就可以了,sdb2用來作為將來系統的/分區,我給了10G。然后將兩個分區格式化為ext4系統。 mkdir /mnt/boot mkdir…

    Linux干貨 2016-09-13
欧美性久久久久