Linux的文本處理工具之sed的使用

Sed文本處理工具

一、認識sed工具:

sed是一種流編輯器,一次處理一行內容。當進行處理時,把當前處理的行存儲在臨時的緩沖區中(俗稱“模式空間”)后,再用sed命令去處理緩沖區的內容,最后把處理過的緩沖區內容送往屏幕打印顯示。接著處理下一行,不斷重復進行讀取、處理、輸出,直到文件末尾。 

注:sed命令處理文本,文件內容本身并沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等 

二、使用man幫助了解sed的使用格式和常用的選項(#man sed):

NAMEsed的介紹)

sed – stream editor for filtering and transforming text 

SYNOPSISsed的格式使用)

sed [OPTION]… {script-only-if-no-other-script} [input-file]…

注:“script”為‘地址命令’ 

DESCRIPTIONsed的常用選項,如下挑選的選項使用上比較多,其他選項請查閱man幫助)

-n, –quiet, –silent  靜默模式,不將模式空間內容輸送到屏幕上打印。

suppress automatic printing of pattern space 

-e script, –expression=script   多點編輯。

add the script to the commands to be executed 

-f script-file, –file=script-file 從指定的文件中讀取已經編輯好的腳本。

add the contents of script-file to the commands to be executed

–follow-symlinks

follow symlinks when processing in place 

-i[SUFFIX], –in-place[=SUFFIX]   在原文本處編輯(此處選項不建議使用,如果實在是要在原處編輯,請做好數據備份后再操作,以免數據的丟失。)

edit files in place (makes backup if SUFFIX supplied) 

-r, –regexp-extended  支持擴展正則表達式的使用。

use extended regular expressions in the script.

三、了解sed的簡單編輯命令以及高級編輯命令:

1、  簡單編輯命令:

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

p: 顯示模式空間中的內容

a \text:在行后面追加文本;支持使用\n實現多行追加

i \text:在行前面插入文本;支持使用\n實現多行插入

c \text:替換行為單行或多行文本

w /path/to/somefile :保存模式匹配的行至指定文件

r /path/from/somefile:讀取指定文件的文本至模式空間中匹配到的行后

= :為模式空間中的行打印行號

! :模式空間中匹配行取反處理

2、  高級編輯命令:

高級編輯命令:

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

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

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

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

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

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

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

d: 刪除模式空間中的行

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

四、上面了解到sed是文本行處理的流編輯器,那么sed是如何定位要修改的內容呢?那么下面一起來學習sed的地址定界和查找替換:

1、地址定界:

(1) 不給地址:對全文進行處理。

(2) 單地址:

#: 指定的行

/pattern/:被此處模式所能夠匹配到的每一行(模式空間)。

(3) 地址范圍:

#,#    指定從第幾行開始到第幾行結束進行處理。

#,+#   指定從第幾行開始,往后需要處理多少行。

/pat1/,/pat2/   模式空間定界。指定從第一個被模式空間匹配到開始,直至到被第二個模式空間匹配到結束來進行處理。

#,/pat1/   指定行與模式空間的配合使用;指定從第幾行開始,到被模式空間匹配到的行進行處理。

(4) ~:步進

1~2 奇數行  只處理文本內容中的奇數行

2~2 偶數行  只處理文本內容中的偶數行

如下圖:分別將文本內容中的奇數行或者偶數行刪除掉

blob.png

2、查找與替換:

s///:查找替換,支持使用其它分隔符,如:s@@@,s### 

替換標記:

g: 是行內全局替換

p: 將顯示替換成功的行

w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中 

學習了上面的理論講述,下面進行相應的事例演示:

1、簡單編輯命令的使用:

sed ‘2p’ /etc/passwd  打印文本內容中的第二行并把文本的原內容一起輸送到屏幕顯示,可結合靜默模式的選項-n配合使用(如下一事例題)

blob.png

sed -n ‘2p’ /etc/passwd

blob.png

sed -n ‘1,4p’ /etc/passwd 在屏幕上打印顯示文本內容中的第一行到第四行的內容。

blob.png

sed -n ‘/root/p’ /etc/passwd 只打印顯示被模式空間匹配到的行

blob.png

sed -n ‘2,/root/p’ /etc/passwd 2行開始,到被模式空間匹配到之間的所有行

blob.png

sed -n ‘/^$/=’ /testdir/issue 顯示空行行號(如下圖,原文本中第三行為空行)

blob.png

sed -n -e ‘/^$/p’ –e ‘/^$/=’ /testdir/issue 打印空行的行號和空行;多點編輯

blob.png

sed ‘/root/a\superman’ /etc/passwd  在被模式空間匹配到的行后新增一行打印Superman

blob.png

sed ‘/root/i\superman’ /etc/passwd  在被模式空間匹配到的行前新增一行打印Superman

blob.png

sed ‘/root/c\superman’ /etc/passwd  將被模式空間匹配到的行全部替換成了Superman

blob.png

sed ‘/^$/d’ /testdir/issue   將文本中的空行全部刪除掉

blob.png

sed ‘1,10d’ /testdir/passwd 將文本中的前十行刪除掉,只打印顯示剩余的行

blob.png

nl /etc/passwd| sed‘2,5d’ 給文本加以顯示行號,并刪除第二行到第五行的內容

blob.png

nl/ etc/passwd| sed‘2a tea’  給文本加以顯示行號,并給第二行后新增一行插入單詞tea

blob.png

sed 's/nologin/csh/g' /testdir/passwd  在文本中全局查找nologin,并將其替換成csh

blob.png

sed -n‘s/root/&superman/p’ /etc/passwd在被模式空間匹配到的單詞后面增加Superman

blob.png

sed -n‘s/root/superman&/p’ /etc/passwd 在被模式空間匹配到的單詞前面增加Superman

blob.png

2、高級編輯命令的使用:

sed -n 'n;p' /testdir/ff  打印偶數行

blob.png

sed '1!G;h;$!d' /testdir/ff  逆序顯示

blob.png

sed '$!N;$!D' /testdir/ff 打印最后兩行

blob.png

sed '$!d' /testdir/ff 打印最后一行

blob.png

sed ‘G’ /testdir/ff  打印所有的行,并在每一行的后面增加一個空行

blob.png

# sed 'g' /testdir/ff 打印空白行

blob.png

sed -n '1!G;h;$p' /testdir/ff  同樣是逆序打印

blob.png

# sed '/^$/d;G' /testdir/ff 

blob.png

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

(0)
Aaron_wangAaron_wang
上一篇 2016-08-10 10:22
下一篇 2016-08-10 10:22

相關推薦

  • 自定義命令別名及引用結果

    自定義命令別名及引用結果 alias alias命令用來設置指令的別名。我們可以使用該命令可以將一些較長的命令進行簡化。 語法 alias(選項)(參數) 選項 -p:打印已經設置的命令別名。 參數 命令別名設置:定義命令別名,格式為“命令別名=‘實際命令’” 實例 顯示已設置的別名 [root@localhost ~]# alias alias cp=’c…

    Linux干貨 2018-03-11
  • 使用cp命令定時復制數據

    cp命令 cp命令用來將一個或多個源文件或者目錄復制到指定的目的文件或者目錄。 cp [選項] [參數] 常用選項: -r -R 遞歸拷貝目錄及目錄里所有的內容 -i 交互式,默認支持 -d 復制的時候,如果目錄有鏈接文件,則只復制鏈接文件 -p –preserv,復制的時候將文件的屬性一起復制 -a = -dpR -v 復制的時候顯示詳細過程 如何定期執…

    Linux干貨 2017-04-03
  • N28-第一周

    1. 描述計算機的組成及其功能。
    2. 按系列羅列Linux的發行版,並描述不同發行版之間的聯繫與區別。
    3. 描述Linux的哲學思想,並按照自己的理解對其進行解釋性描述。
    4.說明Linux系統上命令的使用格式;詳細介紹ifconfig、echo、tty、startx、export、pwd、history、shutdown、poweroff、reboot、hwclock、date命令的使用,並配合相應的示例來闡述。
    5.如何在Linux系統上獲取命令的幫助信息,請詳細列出,並描述man文檔的章節是如何劃分的?
    6.請羅列Linux發行版的基礎目錄名稱命名法則及功能規定。

    Linux干貨 2017-12-04
  • MySQL/MariaDB數據庫基于SSL實現主從復制

    前言 備份數據庫是生產環境中的首要任務,重中之重,有時候不得不通過網絡進行數據庫的復制,由于MySQL/MariaDB的主從復制是明文傳送的,如果在生產環境中跨網絡傳送,數據的安全性就無法完全保證,為了解決這一問題,我們需要一種安全的方式進行傳送,即基于SSL加密進行數據傳輸。 部署配置 實驗拓撲 實驗環境 系統環境:CentOS6.6 數據庫版本:mari…

    Linux干貨 2015-06-21
  • bash 數組和變量

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

    Linux干貨 2016-08-24
  • 搭建路由環境

        五個虛擬機分別模擬三個路由器和兩個主機,實現不同網段的主機之間的通信。 1.規定四個網段的ip地址:分別是192.168.1.0/24;192.168.2.0/24;192.168.3.0/24;192.168.4.0/24 2.三個路由器命名為R1、R2、R3。R1的兩個網關地址為192.168.1.1和19…

    2017-08-20

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-08-10 10:43

    架構清晰,思路清晰,有理論有時間。排版需要改進,對小標題或二級標題可以適當的進行一些字體上的調整。

欧美性久久久久