文本處理工具之sed

一.介紹

sed是一個流編輯工具,可以用來實現對文本的過濾與替換,而Linux的哲學思想之一就是一切皆文件,因此對文本的操作至關重要。sed的基本工作原理是通過每次讀取一行文本來來對默寫符合條件的文本進行處理。要注意的是sed默認并不直接修改源文件,而是將讀取到的內容復制到緩沖區在中,這個緩沖區也叫做模式空間,然后在模式空間中對文本進行處理,處理完成后將結果輸送到標磚輸出。

二.sed的使用

1.使用格式:

sed [options] {script} [file]

常用的選項:

–help:獲取幫助
-n,–quiet:使用靜默模式,可以屏蔽自動打印功能
-e <script>:指定sed腳本
-f <file>:從指定的文件中獲取指令
-i:直接對源文件進行處理
-r:在腳本中使用正則表達式

2.sed中的操作地址定界

number:指定要對哪個行進行處理

start~step:指定其實位置和步長,例如偶數行:2~2

/pattern/:pattern為正則表達式指定的模式
addr1,addr2:從addr1到addr2之間的所有行
addr1,+number:從addr1開始之后的number行
$:最后一行
add1,/pattern/:從addr1開始到pattern之間的所有行

3.sed中常用的指令

a:追加 s:替換
d:刪除 i:插入
c:修改 p:打印
w:保存至指定文件中 !:條件取反

三.使用示例

測試文本為fstab

  1. 在第三行后面追加'hello'

sed '3a hello' fstab

2.在第三行之前插入'hello world'

sed '3i hello world' fstab

3.將所有#開頭的行刪除

sed '/^#/d' fstab

4.在所有以#開頭的行后面添加新行'hello'

sed '/^#/a hello' fstab

5.刪除所有空白行

sed '/^$/d' fstab

6.打印奇數行

sed -n '1~2p'fstab

7.將UUID修改為uuid

sed '/UUID/c uuid' fstab


四.sed腳本

當sed指令較長時,就可以將其寫到一個文件中,sed腳本的基本格式是:

address{

command1

command2

}

執行腳本時:sed -f script source_file

  1. 使用示例:

找到文本中每行的第二個test,并將其該為test2

/test/{

s//test2/2

}

2.給所有的文本中所有的test添加“”

/test/{

s//"&"/g

}

3.讀取多個文件

/.*/{

$r 1.sh

}

五.sed的高級應用

在一般情況下,sed處理的文本都是在一個叫做模式空間的緩沖區中,sed在執行命令時,這個空間就是用來保存待處理的文本,但sed還有另一個緩沖區域,這個區域叫做保持空間,當sed處理模式空間中的某些行時,可以用保持空間來臨時存放一些行。sed的一些高級應用會涉及到保持空間。

1.next命令

n命令會移動到數據流的下一行。

例如:(1)在文本中找到hello所在的行,并將其后面的空白行刪除

sed '/hello/{ n;d}' test

(2)打印偶數行

sed -n 'n;p' test

N命令會下一行添加到模式空間中已經存在的行的后面,

例如:(1)將hello所在行的后面一行合并到hello所在行

sed '/hello/{N;s/\n/ /}' test

(2)替換出現在相連行中的文本,例如替換下面文本中test1 file為test file:

this is a test1 

file , name is test

sed 'N;s/test1\nfile/test\nfile/' test

但是替換之后原本的兩行內容會被合并成一行,于是解決辦法就是使用兩個替換命令來處理

sed 'N;s/test1\nfile/test\nfile/;s/test1 file/test file/' test

(有點難懂,多體會體會)

2.多行刪除

D:只刪除模式空間中的第一行

例如:當文本中有多個空白行,現在只刪除第一個空白行,對于下面的文本,刪除第一個空白行

this is a test1 

file , name is test

sed '/^$/;{N;/this/D}' test

3.關于保持空間中使用的命令

h:將模式空間中的內容復制到保持空間中
H: 把模式空間中的內容追加至保持空間中
g: 把保持空間中的內容復制到模式空間
G: 把保持空間中內容追加到模式空間中
x: 交換保持空間和模式空間中的內容

使用示例:將相連的兩行調換位置

sed -n '{h;n;p;g;p}' test

解釋:當第一行被加載到模式空間之中,h將這一行復制到保持空間,n會跳過這一行,打印下一行,然后g命令又會將第一行復制回來,然后打印,這樣,相連的兩行就會被調換順序。

4.排除命令(!)

即排除符合條件的文本,例如不答應包含hello的行

sed '/hello/!p' test

逆序打印文本:

sed -n '{1!G;h;$p}' test

解釋:當第一行被載入模式空間之后,h命令會把這一行復制到保持空間,知道模式空間中遇到最后一行才打印,當到最后一行時,保持空間中的順序是4321,于是再將保持空間中的內容打印就是逆序輸出了。

5.替換符號&

&可以用來引用替換命令中所匹配到的內容

例如:將文本中的hello都加上一個引號,注意這里的&替換的是整個模式匹配到的內容,不僅僅是一個單詞,只是本例中恰好一個單詞而已。

sed 's/hello/"&"/' test

6.替換單獨的單詞

可以使用圓括號()來定義替換模式中的子模式

例如:文本中有多個world,現在只需替換文本中hello world中的world為girl

sed 's/\(hello\) \(world\)/\1 girl/' test

這個使用方法十分詭異,我的理解是文本被載入到模式空間之后,原本的順序會被顛倒。

7.加倍行距

例如:在每個文本的每個行后面添加一個空白行

sed 'G' test

解釋:因為保持空間只有一個空白行,所以每次模式空間操作完成之后,G會把保持空間中的空白行復制到模式空間,于是再次打印就會在原文件的每個行后面添加一個空白行。

8.給文件中的行編號

sed '=' test | sed 'N;s/\n/ /'

常用的也就這些,關于sed的高級用法,會有些難以理解,如有理解錯誤的地方,請給予指正。

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

(0)
zhangbaozhangbao
上一篇 2017-01-05 17:13
下一篇 2017-01-05 21:29

相關推薦

  • 一點點RPM

    1、軟件管理器簡介          隨著Linux的不斷發展及越來越多的人投入到Linux大家庭中,軟件管理器的作用對于還無法熟練掌握源碼編譯安裝的人們還是顯得尤為重要,同時,由Linux開發商在為其編譯完成的軟件包在某種程度上要比在網絡上流傳的軟件包要安全的多;所以,掌握Li…

    Linux干貨 2015-12-06
  • N22-第四周博客作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 [root@localhost ~]# ll -d  /etc/skel/drwxr-xr-x. 3 root root 74 3月&…

    Linux干貨 2016-09-19
  • 馬哥教育網絡班21期-第二周課程練習

    第二周課程練習 1、Linux上的文件管理類命令都有哪些,其常用的使用方法及其相關示例演示?     1.1 目錄管理類命令:cd,pwd,ls,mkdir,rmdir,tree          1.1.1 cd:主要功能是改變當前目錄,…

    Linux干貨 2016-07-04
  • 馬哥教育絡班22期-第1周博客作業

    第一周博客作業 1 描述計算機的組成及其功能 計算機由硬件和軟件兩大部分組成: 1.1 計算機硬件組成與功能 計算機硬件由運算器、控制器、存儲器、輸入設備、輸出設備五大部分組成。 1.1.1 運算器 算術邏輯部件ALU,執行算術運算和邏輯運算。例如:加減乘除,移位,取模。運算器的核心是加法器。 1.1.2 控制器 控制器是計算機的指揮中心,它的主要作用是按照…

    Linux干貨 2016-08-14
  • 8-4 文本處理工具

    本節主要了解文本處理工具 文件查看命令:cat  tac  rev     cat [OPTION]… [FILE]…         -E:顯示行結束符$    &…

    Linux干貨 2016-08-07
欧美性久久久久