馬哥教育21期網絡班—第15周課程+練習—-sed 總結

sed:編輯器 流編輯器,文本流編輯

ed: Stream EDitor, 行編輯器;
介紹:sed是 一個非交換性文本流編輯器,它編輯文件或標準輸入導出的文本拷貝。標準輸入可能來自鍵盤、文件重定向、字符串或變量,或者管道的文本。
sed可以干什么?
別忘了vi也是一個文本編輯器。sed可以隨意編輯小或大的文件,有許多sed命令用來編輯、刪除,并允許做這項工作時不在現場。sed一次性處理所有改變,因而變得效率高,節省時間。

sed工作原理

pattem space:模式空間
讀取文件一行至模式空間
sed命令是面向行處理的,每次處理一行內容。處理時,sed會把要處理的行存儲在緩沖區中,接著用sed命令處理緩沖區的內容,處理完成后,把緩沖區內容送至屏幕。接著處理下一行,不斷重復,直到末尾,這個緩沖區被稱為"模式空間"。

用法:

sed [選項] sed 命令 輸入文件
script: 
	'地址命令'
在命令行使用sed命令時,實際上命令要加單引號,sed也允許加雙引號。

常用選項:

-n:不輸出模式中的內容至屏幕;
-e: 多點編輯;
-f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本;
-r: 支持使用擴展正則表達式;
-i: 原處編輯;
地址定界:
(1) 不給地址:對全文進行處理;
(2) 單地址:
#: 指定的行;
/pattern/:被此處模式所能夠匹配到的每一行;
(3) 地址范圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步進
1~2:所有奇數
2~2:所有偶數
編輯命令:
d: 刪除
p: 顯示模式空間中的內容  地址定界 一塊使用,被地址界定的,通常與-n
a \text:在行后面追加文本;支持使用\n實現多行追加;
i \text:在行前面插入文本;支持使用\n實現多行插入;
c \text:替換行為單行或多行文本;
w /path/to/somefile: 保存模式空間匹配到的行至指定文件中;
r /path/from/somefile:讀取指定文件的文本流至模式空間中匹配到的行的行后;
=: 為模式空間中的行打印行號;
!: 取反條件; 
s///:支持使用其它分隔符,s@@@,s###;
替換標記:
g: 行內全局替換;
p: 顯示替換成功的行;
w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
sed 's@r..t@&er@' /etc/passwd  后向引用

練習:

使用-p顯示行
print 命令格式為[address,[address]p,一般跟-n選項
顯示/etc/passwd第二行
sed -n '2p' /etc/passwd
顯示/etc/passwd前三行
sed -n '1,3p' /etc/passwd
顯示以root開頭的行
sed -n '/^root/p' /etc/passwd
顯示已root開頭和nologin結尾的行
sed -n '/^root/,/nologin$/p' /etc/passwd
打印最后一行
sed -n  '$p'  /etc/passwd
打印首行
sed -n  '1p'  /etc/passwd
打印全部
sed -n  '1,$p'  /etc/passwd
使用模式和行號進行查找
格式--->line_number,/pattern/
在11行查找root
sed -n  '11,/root/'p  /etc/passwd
顯示所有奇數行
sed -n '1~2p' a
顯示所有偶數行
sed -n '2~2p' a 
d: 刪除
刪除/etc/passwd第一行
sed -n'1d' /etc/passwd
刪除第一到第三行
sed -n '1,3d' /etc/passwd
刪除最后一行
sed '$d' /etc/passwd
刪除uucp這個字符串的一行
sed -n  '/uucp/d' passwd 
a \text
在root行前面追加hello word 
sed -i  '/root/ a \hello word' passwd 
i \text
在root行后面追加hello word
sed -i  '/root/ i \hello word' passwd 
c \text
替換root所在的行為hello word 
sed -i  '/root/ c \hello word' passwd 
s///---->替換
替換night為NIGHT
sed -n 's/night/NIGHT/' a
刪除第7行的#
sed  '7s/\#//' fstab 
把所有的ntp換成the
sed 's@ntp@the@g' passwd
sed 's#ntp#the#g' passwd
sed 's/ntp/the/g' passwd
把的ntp換成the,替換后的結果保存到sed.out
sed 's/ntp/the/g w sed.out' passwd
刪除/boot/grub/grub.conf文件中所有以空白開頭的行行首的空白字符;
~]# sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符;
~]# sed 's@^#[[:space:]]\+@@' /etc/fstab
echo一個絕對路徑給sed命令,取出其基名;取出其目錄名;
~]# echo "/etc/sysconfig/" | sed 's@[^/]\+/\?$@@'

高級編輯命令:

h: 把模式空間中的內容覆蓋至保持空間中;
H:把模式空間中的內容追加至保持空間中;
g: 從保持空間取出數據覆蓋至模式空間;
G:從保持空間取出內容追加至模式空間;
x: 把模式空間中的內容與保持空間中的內容進行互換;
n: 讀取匹配到的行的下一行至模式空間;
N:追加匹配到的行的下一行至模式空間;
d: 刪除模式空間中的行;
D:刪除多行模式空間中的所有行;

sed -n 'n;p' FILE:顯示偶數行
sed '1!G;h;$!d' FILE:逆向顯示文件內容
sed '$!N;$!D' FILE: 取出文件后兩行;
sed '$!d' FILE:取出文件最后一行;
sed 'G' FILE: 加空白行
sed '/^$/d;G' FILE: 多空白行合并
sed 'n;d' FILE: 顯示奇數行;
sed -n '1!G;h;$p' FILE: 逆向顯示文件中的每一行;

一些快速刪除命令

's / \ . $ / / g'                 刪除以句點結尾行
'-e /abcd/d'                      刪除包含a b c d的行
's / [ ] [ ] [ ] * / [ ] / g'     刪除一個以上空格,用一個空格代替
's / ^ [ ] [ ] * / / g'           刪除行首空格
's / \ . [ ] [ ] * / [ ] / g'     刪除句點后跟兩個或更多空格,代之以一個空格
'/ ^ $ / d'                       刪除空行
's / ^ . / / g'                   刪除第一個字符
's /CO L \ ( . . . \ ) / / g'     刪除緊跟COL的后三個字母
's / ^ \ / / / g'                 從路徑中刪除第一個\
's / [ ] / [ ] / / g'             刪除所有空格并用tab鍵替代
'S / ^ [ ] / / g'                 刪除行首所有tab鍵
's / [ ] * / / g'                 刪除所有tab鍵

sed 的一些很有用的替換

顯示/etc/passwd中前5行的用戶名
head -n 5 passwd | sed 's/:.*$//'
將以d或D開頭的行,所有小寫x換成大寫X
sed '/^[dD]/s/x/X/g' test 
刪除每行最后的兩個字符
sed 's/..$//' test 
刪除每行前兩個字符
sed 's/..//' test

&的妙用

[root@localhost ~]# cat b 
Beijing
London
[root@localhost ~]# sed 's/B.*/&2008/' b 
Beijing2008
London
[root@localhost ~]# sed 's/Bei/&2008/' b
Bei2008jing
London

sed中()有深意

echo "hello word" | sed 's/\(hello\).*/word \1/'
定位行范圍
sed -n '/2005/,/2007/p' abc
-e選項設置
sed -n -e '1,2p' -e '4p' abc
sed -e 's/Beijing/London/g' -e '/Beijing/d' abc
-f 選項設定command文件
cat callsed 
/2004/,/2006/p
sed -n -f callsed abc
Beijing 2004
Beijing 2005
Beijing 2006
內容插入體驗
在2005行下面插入ins.txt
sed '/2005/r ins.txt' abc

sed動作使用

y動作
實現前后字符替換
sed 'y/ei/ie' mysed.txt
y///和s///區別
y的語法格式是y/source/dest,表示將source中的字符對位替換為dest中的字符;而s/regexp/replacement/,表示通過正則匹配到的內容替換為replacement部分。
y只是簡單的逐字體換,沒有很多花樣。s支持&符號和預存儲等特性,可以實現更多靈活的替換效果。
sed 'y/ee/ie/' mysed.txt
n動作使用
sed '/200/{n;y/eijing/EIJING/;}' mysed.txt
Beijing 2003
BEIJING 2004
n隔行替換

原創文章,作者:N21_ Dominic,如若轉載,請注明出處:http://www.www58058.com/56669

(0)
N21_ DominicN21_ Dominic
上一篇 2016-11-14
下一篇 2016-11-14

相關推薦

  • dd工具

    dd     dd命令:convert and copy a file     用法:        ddif=/PATH/FROM/SRC of=/PATH/TO/DEST       &…

    Linux干貨 2016-09-02
  • 由Linux中一個小問題引發的思考

    一、一個小問題 1、在學習Linux中我們經常會遇到很多有趣的小問題,今天筆者就遇到了一個很有意思的小問題,現在分享給大家:      “如何在本機字符終端登陸時,除顯示原有信息外,再顯示當前終端號,時間和主機名?” 2、實現方法如下:      輸入vim /etc/…

    2017-07-16
  • linux磁盤管理

    硬盤接口類型:         IDE:并口,133M/s;100個IO/s        SCSI:并口,UltraSCSI320,320M/s UltraSCSI640 640M/s 150-200IO/s&nbsp…

    Linux干貨 2016-08-29
  • grep,sed命令

         文本編輯種類:      行編輯器:sed      全屏編輯器 :nano,vi            vim :vi Mproved      模式化的編輯器: &n…

    Linux干貨 2016-08-12
  • SHELL編程之數組運用及YUM軟件包管理

    SHELL編程中,當要引用到多個值的時候,一個一個地進行變量賦值會讓我們的腳本變得繁瑣,不利于代碼的優化,所以,就需要通過數組進行定義,優化代碼,減少不必要的定義和命令操作。 SHELL中的數組:存儲多個元素的連續內存空間 數組名:整個屬組只有一個名字 數組索引: 編號從0開始   數組名[索引]   ${array_name[index…

    Linux干貨 2016-08-24
  • Linux之任務計劃 crontab

    Linux之任務計劃    用過windows的同學應該都知道在控制面板中有一個“任務計劃”選項,我們可以通過向導設置讓計算機在某個時間點或者開機時運行某個腳本或者批處理等等,方便我們的日常管理監視工作;同樣在Linux系統中,如果我們想在開機時就運行某個操作,可以直接將命令寫入/etc/rc.local中,該操作就會在機器開機時運行;如…

    Linux干貨 2015-05-18

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-11-16 15:49

    是不是還有awk的沒有寫,sed的寫的很棒,期待你的awk的佳作

欧美性久久久久