文本處理三劍客-sed

1.文本處理三劍客-sed

#sed語法:
sed  [OPTION]...  {script-only-if-no-other-script}
       [input-file]...

sed理解:是一種流編輯器,一次處理一行內容,處理時把當前處理的行存儲在臨時緩存中,成為“模式空間”,接著用sed命令處理緩沖區的內容,處理完畢后吧緩沖區內容輸出到屏幕接著處理下一行。這樣不斷重復到末尾。文件內容并沒有改變。除非使用重定向輸出才會改變內容。

 常用選項

-n 不輸出模式空間到屏幕
-e 多點編輯,或
-f 從指定文件中讀取編輯腳本
-r 使用擴展表達式
-i 原處編輯

2.sed處理地址范圍定界:

1. 不給地址表示對全文處理


2. 單地址 指定行 ‘1‘ 第一行 ;

/ 關鍵字,可以是正則表達式或其他模糊匹配的符號/


3. 地址范圍

'2,10'第二行到第十行 

’2,+10‘第二行再加10行 

/關鍵字/,/關鍵字/匹配第一個關鍵字到第二個關鍵字之間的內容 ;


4. 步進 

’1~2‘奇數行  

’2~2’偶數行

3.sed編輯命令

d 刪除模式空間匹配到的行

[root@localhost testdir]# sed '1d' 1
     2	#
     3	# /etc/fstab
     4	# Created by anaconda on Thu Jul 28 17:47:00 2016


p 顯示模式空間中的內容

[root@localhost ~]# sed '2p' /etc/issue
\S
Kernel \r on an \m
Kernel \r on an \m

顯示兩次的原因因為在模式空間輸出一次然后p顯示一次,加上-n是表示不輸出模式空間到屏幕,如下輸出


[root@localhost ~]# sed '2p' /etc/issue
\S
Kernel \r on an \m


a \添加內容 在匹配行后加入文本 \n多行插入

#實例解釋
[root@localhost testdir]# sed -e  /UUID/a\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX -e /UUID/i\ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ  file1
     1	
     2	#
     3	# /etc/fstab
     4	# Created by anaconda on Thu Jul 28 17:47:00 2016
     5	#
     6	# Accessible filesystems, by reference, are maintained under '/dev/disk'
     7	# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
     8	#
     9	/dev/mapper/centos-root /                       xfs     defaults        0 0
ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
    10	UUID=aea23617-8678-414a-bd12-59f03ea9deb0 /boot                   xfs     defaults        0 0
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

i \添加內容  在匹配行后加入文本 \n多行插入

#實例解釋
[root@localhost testdir]# sed '/^U/i\ZZZZZZZZZZZZZZZZZZZZZ\nNNNNNNNNNNNNNNNNNNNNNN\nssssssssssssssss' file3
#輸出結果
ZZZZZZZZZZZZZZZZZZZZZ
NNNNNNNNNNNNNNNNNNNNNN
ssssssssssssssss
UUID=aea23617-8678-414a-bd12-59f03ea9deb0 /boot

        

c \替換內容 替換單行或多行文本

#實例解釋,也支持\n換行
[root@localhost testdir]# sed '/^U/c\relace' file3
#將以U打頭的行替換成‘relace’

w /保存新文件路徑

[root@localhost testdir]# sed '/^U/w /testdir/5' file3

r /保存文件路徑

[root@localhost testdir]# sed '/^U/r /etc/issue' file3

= 在模式空間中打印行號

[root@localhost testdir]# sed '/^U/=' file6

!模式空間匹配到的取反

[root@localhost testdir]# sed '/^U/!=' file6

#ps:sed文件出是不修改原文件內容的,如果要修改可以使用選項-i

[root@localhost testdir]# sed -i '/^U/d' 3

修改之前可以將文件進行備份,在-i選項后面添加備份名可以在修改之前備份該文件

[root@localhost testdir]# sed -i.bak '/^U/d' 3

4.sed搜索替換

s/// 查找替換 支持使用分割符包括s@@@,s### 替換標記;
g:全局替換
p:顯示替換成功的行
w 將替換成功的行保存至新文件
#實例操作解釋
#1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符
[root@localhost testdir]# sed '/^[[:space:]]\+/d' /etc/grub2.cfg 
#2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
[root@localhost testdir]# sed 's/^#[[:space:]]\+//' /etc/fstab
#3、在/root/install.log每一行行首增加#號
[root@centos6 ~]# sed -n 's/^/#/p' /root/install.log
#4、在/etc/fstab文件中不以#開頭的行的行首增加#號
[root@centos6 ~]# sed 's/^[^#]/#/' /etc/fstab
#5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
取基名
echo "/etc/fst/sd" | sed -r  's@(.*)/([^/]+/?)@\2@'
echo "/etc/fst/sd" | sed   -r 's@(.*/)([^/]+/?)$@\1@' 
echo "/etc/fst/sd/" | sed  's@.*\<@@'
取目錄
echo "/etc/fst/sd/" | sed -r  's#[^/]+/?$##'
#6、利用sed 取出ifconfig命令中本機的IPv4地址
[root@centos6 ~]# ifconfig|sed -n '2p'|sed 's/\<B.*//'|sed 's/^.*r:'//
#7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數
[root@centos6 Packages]# ls |sed 's/.rpm$'//|sed 's/.*\.'//|sort|uniq -c

5.sed高級應用

首先要了解使用sed兩個緩存空間,一個是模式空間,在前面已經說過了

另一個是保持空間

下面幾個是sed的高級應用

h: 把模式空間中的內容覆蓋至保持空間中

H:把模式空間中的內容追加至保持空間中

g: 從保持空間取出數據覆蓋至模式空間

G:從保持空間取出內容追加至模式空間

x: 把模式空間中的內容與保持空間中的內容進行互換

n: 讀取匹配到的行的下一行覆蓋至模式空間

N:追加匹配到的行的下一行至模式空間

d: 刪除模式空間中的行

D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed

#實例解釋以后補充

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

(0)
snowbamboosnowbamboo
上一篇 2016-08-12
下一篇 2016-08-12

相關推薦

  • 用戶及相關權限命令

    2018-03-26

    2018-03-26
  • sed簡介及常見用法

    sed是一個文本流處理器,配合正則表達式用可以實現很多文本處理操作。 和grep一樣,sed是一行一行的處理的。sed處理文本時,首先會將源文件復制一份到內存中,然后將文本一行一行拿到模式空間內進行操作,最后輸出到標準輸出,即屏幕上。 在模式空間中,每一行都會根據用戶給的條件進行匹配,匹配到了進行編輯后輸出,沒有匹配到,直接輸出到標準輸出。sed除了模式空間…

    2018-01-04
  • 文本處理三劍客之sed

    概述     經過上篇對正則表達式和grep相關內容的學習,我們對文本處理有了一個初步的認識,本篇將簡要介紹一下文本處理三劍客之sed。具體分為以下幾個部分:     1、sed原理概述     2、sed命令詳解 第一部分 &n…

    Linux干貨 2016-08-10
  • 馬哥教育第一天

    來到馬哥教育第一天,初步接觸IT,第一次寫博客,不知道寫點啥,記幾個地址吧。

    2018-03-26
  • 小練習題。【第五周】

    1、顯示當前系統上root、fedora或user1用戶的默認shell; /]# cat /etc/passwd | grep '^root\|fedora\|user1' |cut -d':' -f1,7 2、找出/etc/rc.d/i…

    Linux干貨 2016-11-26
  • 網卡別名及多網卡配置

    網卡別名 對于要在不同網段環境中使用的設備有很大的幫助。     要使用網卡別名首先要關閉NetworkManager這個服務,防止在后續操作中引起不必要的沖突。 [root@laodeng6 ~]# chkconfig NetworkManager off [root@laod…

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