1. 程式人生 > >sed 強大的流文本編輯器淺析及示例演示

sed 強大的流文本編輯器淺析及示例演示

sed 流編輯器 行編輯器 註釋

MarkdownPad Document

sed 流(行)編輯器

著有文本處理三劍客之稱:grep , sed , awk

sed作為其中之一對於文本處理可謂是異常強大,能夠大批量處理文本復雜繁瑣的修改,添加,刪除等操作,並能夠完美的與正則表達式相結合使用.
處理文本時按數據流進行處理,每次讀取文本的一行,將其放入緩沖區中稱之為模式空間(pattern space),也可類比理解為工作臺,然後根據地址定界或是正則表達式進行匹配,如果被匹配則執行其後的命令作出相應處理動作,而後讀取下一行處理,不斷重復.
值得註意的是sed默認會將讀取到模式空間中的行輸出到標準輸出(一般是屏幕),並將處理完成後的行輸出至標準輸出.默認對文件本身不處理,僅處理模式空間中被模式匹配的行.

sed 命令使用格式:

sed [option] ‘AddressCommand‘ input-file...
sed 可選項 ‘地址定界命令‘ 處理文本(可以是多個文件的列表處理)

option選項:

-n:只顯示符合條件的行,靜默模式關閉上面提到的默認打印模式空間至標準輸出
-i:直接修改源文件(做任何修改操作之前先備份.bak)
-f:從文件讀取編輯腳本(符合sed語法的腳本並非bash腳本)
-e:指定多個sed語法腳本,類似grep -e用法多點處理
-r:支持擴展的正則表達式
Address地址定界:

1. startline,endline 從第幾行到幾行

sed -n ‘1,100p‘ /var/log/yum.log /var/log/messages


$:最後一行
sed -n ‘$p‘ /var/log/yum.log
$-1:最後第二2行
1,+2d:刪除第一行和緊跟其後的後兩行(註意刪除操作不加-n才可看到效果)
sed ‘1,+2d‘ /etc/fstab
~:步進
1~2p 從第一行開始,每次跳兩行,也即奇數行
1~2p 偶數行

2. /regexp/ 正則表達式匹配

/^root/

3./patternl/,/pattern2/ 第一次匹配到pattern1的行開始到第一次被pattern2匹配的行為止(註意並不是僅匹配一次,如果處理的文本中存在多個符合條件的組合將處理每個分組)
Command命令(觸發動作):

  d:刪除匹配的行,沒被匹配的反而顯示  
  p:顯示匹配的行  
  a \string:在匹配到行後面追加顯示stringa  
      \n 換行  
  i \string:在匹配到行前面追加顯示string  
  c \string :替換,將string覆蓋匹配的行  
  r file:將指定文件添加到匹配的行處  
  w file:將匹配到的內容另存至文件中  
  = 匹配的行加行號  
  ! 取反,沒有被匹配的行做處理動作

替換和查找:

s/pattern/string/: 將pattern中匹配的字符串替換成string字符串,默認只處理模式空間中第一次被模式匹配的塊,可通過其後的修飾符進行調整作用範圍

   sed ‘s/fstab/testFSTAB/p‘ /etc/fstab    #將fstab替換為testFSTAB

標記符:

   g:全局          
   i:忽略大小寫

s/ / /的形式也可是s@ @ @s# # # 甚至一些其他的字符作為分界,可自行測試
匹配表達式和要替換的字符串之間可支持後向引用
s/()/\1/:將第一個匹配的模式括號的內容引用到後面的\1處替換字符串
&:對string字段引用,pattern中匹配的整個字符串

sed實例演示:

1.地址定界

顯示/etc/fstab的9-12行

[root ~]# sed -n ‘9,12p‘ /etc/fstab
/dev/mapper/vg_root-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg_root-lv_app /app                    ext4    defaults        1 2
UUID=9a92c305-beee-467f-9fe4-fd90b2e49743 /boot                   ext4    defaults        1 2
/dev/mapper/vg_root-lv_home /home                   ext4    defaults        1 2

2.步進及刪除

查找/etc/fstab中除前7行後的奇數行(多種不同形式達到相同效果)

[root ~]# cat -n  /etc/fstab|sed  -n -e ‘1,7d‘ -e ‘1~2p‘(註兩個-e的內容不可反寫)
 9  /dev/mapper/vg_root-lv_root /                       ext4    defaults        1 1
11  UUID=9a92c305-beee-467f-9fe4-fd90b2e49743 /boot                   ext4    defaults        1 2
13  tmpfs                   /dev/shm                tmpfs   defaults        0 0
15  sysfs                   /sys                    sysfs   defaults        0 0
等價於:
[root ~]# cat -n  /etc/fstab|sed  -n ‘1,7d;1~2p‘
等價於:
[root ~]# cat -n  /etc/fstab|sed   ‘1,7d‘ | sed -n  ‘1~2p‘

3.a \在匹配的行後添加內容

實現將root用戶的命令歷史添加執行時間

[root ~]# sed -i ‘$a \export HISTTIMEFORMAT="`date "+%T"`"‘ /root/.bashrc
        #在/root/.bashrc的最後一行添加一條變量

4.正則匹配

關閉第3步的命令歷史時間功能

[root ~]# sed -i ‘/.*HISTTIMEFORMAT.*/d‘ /root/.bashrc 
        # 註意-i 會直接修改源文件,事先備份

5.s///查找替換

實現將文本的4,8行加註釋#

root ~]# sed -i.bak ‘2,5s/.*/#&/g‘ /etc/fstab
       #註意這裏的&是後向引用的用法

6.讀入文件並追加

將創建好的hosts文件內容,追加到/etc/hosts文件後
[root ~]# sed ‘$r hosts‘ /etc/hosts

7.匹配的信息另存為,也即寫入文件

實現將/var/log/messages中關於網卡信息的分離至eth.log中
[root ~]# sed -n -r   ‘/eth[0-9]?/w eth.log‘ /var/log/messages

8.!取反

實現清除所有的#註釋信息行

[root ~]# sed -n ‘/^#/!p‘ /etc/fstab
等價於
[root ~]# sed ‘/^#/d‘ /etc/fstab

本文出自 “老城小敘” 博客,請務必保留此出處http://cityx.blog.51cto.com/9857477/1922794

sed 強大的流文本編輯器淺析及示例演示