Linux sed命令詳則

sed命令

sed是一種流編輯器,它是文本處理中非常好的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前的行儲存在臨時緩存區中,稱為“模式空間”(pattern space),接著用sed命令處理緩存區中的內容,處理完成后,把緩存區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。

Sed的選項,命令,替換標記

命令格式

sed [options]’command’file(s)

sed [options] -f scriptfile file(s)

選項

-e<script>或–expression=<script>:以選項中的指定的script來處理輸入的文本文件;

-f<script文件>或–file=<script文件>:以選項中指定的script文件來處理輸入的文本文件;

-h或–help:顯示幫助

-n或–quiet或——silent:僅顯示script處理后的結果;

-v或–version:顯示版本信息;

參數

文件:指定待處理的文本文件列表。

sed命令

a\  在當前行下面插入文本。

i\   在當前行上面插入文本。

c\   把選定的行改為新的文本。

d   刪除,刪除選擇的行。

D   刪除模板塊的第一行。

s   替換指定字符。

h   拷貝模板塊的內容到內存中的緩沖區。

H   追加模板塊的內容到內存中的緩沖區。

g   獲得內存緩沖區的內容,并替代當前模板塊中的文本。

G   獲得內存緩沖區的內容,并追加到當前模板文本的后面。

l    列表不能打印字符的清單。

n   讀取下一個輸入行,用下一個命令處理新的行而不是第一個命令。

N  追加下一個輸入行到模板塊后面并在二者間嵌入一個新行,改變當前行號碼。

p   打印模板塊的行。

P(大寫)打印模板塊的第一行。

q   退出Sed。

b lable  分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。

r file     從file中讀行。

t label   if分支,從最后一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本末尾。

T label  錯誤分支,從最后一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處, 或者的腳本末尾。

w file  寫并追加模板塊到file末尾。

W  file  寫并追加模板快的第一行到file末尾。

!  表示后面的命令對所有沒有被選定的行發生作用。

=  打印當前行號碼。

#  把注釋擴展到下一個換行符以前。

sed替換標記

g   表示行內全面替換。

p   表示打印行。

w   表示把行寫入一個文件。

x    表示互換模板塊中的文本和緩沖區中的文本。

y    表示把一個字符翻譯為另外的字符(但是不用于正則表達式)

\1  子串匹配標記

&   已匹配字符串標記

sed元字符集

^ 匹配行開始,如:/^sed匹配所有以sed開頭的行

$  匹配行結束,如:/sed$/匹配所有以sed結尾的行。

.   匹配一個非換行符的任意字符,如:/s.d/匹配后接一個任意字符,最后是d。

*   匹配0個或多個字符,如:/*sed/匹配所有模塊是一個或多個空格后緊跟sed的行。

[]  匹配一個指定范圍內的字符,如:/[ss]ed/匹配sed和Sed。

[^]  匹配一個不在指定范圍的字符。如:/[^A-RT-Z]ed/匹配不含A-R和T-Z的一個字母開頭,緊跟ed的行。

\(..\) 匹配子串,保存匹配的字符,如/\(love\)able/\1rs,loveable被替換成lovers。

& 保存搜索字符用來替換其他字符,如s/love/**&**/,love這成**love**。

\<匹配單詞的開始,如:/\love/匹配包含以love開頭的單詞的行。

\>匹配單純的結束,如/love\>/匹配包含以love結尾的單詞的行。

x\{m\} 重復字符x,m次, 如:/0\{5\}/匹配包含5個0的行。

x\{m,\}重復字符x ,至少m次,ru:/0\{5,\}/匹配至少有5個0的行。

x\{m,n\}重復字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10個0的行。

sed用法實例

替換文本中的字符串:

sed  ‘s/book/books/’ file

-n選項和p命令一起使用表示只打印那些發生替換的行:

sed -n ‘s/test/TEST/p’ file

直接編輯文件選項-i,會匹配file文件中每一行的第一個book替換為books:

sed -i ‘s/book/books/g’ file

全面替換標記g

使用后綴/g標記會替換每一行中的所有匹配:

sed ‘s/book/books/g’ file

當需要從第N處匹配開始替換時,可以使用/Ng:

截圖2

定義符

以上命令中字符/在sed中作為定界符使用,也可以使用任意的定義符:


sed ‘s:test:TEXT:g’

sed ‘s|test|TEXT|g’

定界符出現在樣式內部時,需要進行轉義:


sed  ‘s/\/bin/\/usr\/local\/bin/g’



刪除操作:d命令


刪除空白行:


sed  ‘/^$/d’  file

刪除文件的第2行:

sed ‘2d’ file

刪除文件的第2行到末尾所有行:

sed ‘2,$d‘ file

刪除文件的最后一行:

sed  ‘$d’ file

刪除文件中所有開頭是test的行:

sed ‘ /^test/’d file



已匹配字符串標記&


正則表達式\w\+匹配每一個單詞,使用[&]替換它, &對應于之前所匹配到的單詞:

echo this is a test line | sed ‘s/\w\+[&]/g’

   [this]  [is]  [a]  [test]  [line] 


所有以192.168.0.1開頭的行都會被替換成它自己加locahost:


sed ‘s/^192.168.0.1/&localhost/’  file

 192.168.0.1localhost



子串匹配標記\1

匹配給定樣式的其中一部分:


echo this is digit 7 in a number | sed ‘s/digit \([0-9]\)/\1/

this is 7 in a nember

命令中digit 7 ,被替換成了 7 。樣式匹配到的子串是 7 , \(..\)用于匹配子串,對于匹配到的第一個子串標記為\1,以此類推匹配到的第二個結果就是\2 ,例如:

Linux      sed命令詳則

love被標記為1,所有loveable會被替換成lovers,并打印出來:

sed -n ‘s/\(love\)able/\1rs/p’ file

組合多個表達式


sed  ‘表達式’ | sed ‘表達式’

等價于:

sed ‘ 表達式;表達式’

引用

sed表達式可以使用單引號來引用,但是如果表達式內部包含變量字符串,就需要使用雙引號。



test=hello

echo hello WORLD | sed “s/$test/HELLO”

HELLO WORLD


選定行的范圍:,(逗號)

所有在模板test和check所確定的范圍內的行都被打?。?/span>


sed -n ‘test/,/check/p’  file


對于模板test和west之間的行,沒行的末尾用字符串aaa bbb替換:



sed ‘/test/,/west/s/$/aaa bbb/’  file



打印從第5行開始到第一個包含以test 開始的行之間的所有行:



sed -n ‘ 5, /^test/p’  file





多點編輯 :e命令


-e 選項允許在同一行里執行多條命令:


sed -e ‘1,5d’ -e ‘s/test/check/’ file

上面sed表達式的第一條命令刪除1至5行。第二條命令用check替換test。 命令的執行順序對結果有影響,如果兩個命令都是替換命令,那么第一個替換命令影響第二個替換命令的結果。



和 -e 等價的命令是 –expression


sed –expression= ‘s/test/check/’  –expression=’/love/d’ file


從文件讀入:r命令


file里的內容被讀進來,顯示在與test匹配的行后面,如果匹配多行,則file的內容將顯示在所有匹配行的下面:


sed -n ‘test/r file’  filename



寫入文件:w命令


在exampie中所有包含test的行都被寫入file里:



sed -n ‘/test/w file’ example



追加(行下):a\命令


將this is a test line 追加到以test 開頭的行后面:

sed ‘/^test/i\this is a test line’ file


在test.conf文件第5行之前插入 this is a test line:


sed  -i ‘5i\this is a test line’ test.conf




暫時和大家分享到這里,有什么不足之處,請大家和我及時溝通,謝謝。


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

(0)
eedsxbeedsxb
上一篇 2017-08-11
下一篇 2017-08-11

相關推薦

  • 字符串處理

      一.字符串處理 v bash 的字符串處理工具: (一)字符串切片: ${#var}: 返回字符串變量var 的長度 例: [root@lxc ~]# a="     " [root@lxc ~]# echo ${#a} 5 [root@lxc ~]# ${var:offse…

    Linux干貨 2016-11-24
  • Linux bash編程基礎語法總結

    前言 在Linux學習過程中,我們無可避免的會碰到一個既讓人喜歡,又令人頭疼的神奇的東西——bash編程,即shell腳本。那么什么是shell腳本呢?shell是一個命令語言解釋器,而shell腳本則是Linux命令的集合,按照預設的順序依次解釋執行,來完成特定的、較復雜的系統管理任務,類似于Windows中的批處理文件。本文帶來的是bash編程的基礎語法…

    Linux干貨 2015-04-04
  • lamp安裝配置詳細過程(把以前的筆記貼上來)

    準備; 首先進入/usr/local/目錄 #cd /usr/local 刪除所有安裝過的php mysql apache 以及libxml 首先查看目前 /usr/local目錄下面的內容 #ls –l 如果看到php5 php apache2 apache mysql mysql5 libxml libxml2字樣的目錄都將其刪除具體命令如下 #rm –…

    Linux干貨 2015-05-01
  • MySQL高級特性-合并表

    1. Merge Tables         如果愿意的話,可以把合并表看成一種較老的、有更多限制的分區表,但是它們也有自己的用處,并且能提供一些分區表不能提供的功能。 合并表實際是容納真正的表的容器??梢允褂锰厥獾腢NION語法來CREATE TABLE。下面是一個合并表的例子: mysql> &n…

    Linux干貨 2015-04-13
  • lamp的編譯安裝

    基于http的php模塊模式 一、需要準備的軟件:     apr-1.5.0.tar    apr-util-1.5.3.tar    httpd-2.4.9.tar        mysql-5.5.33-…

    Linux干貨 2016-06-22
  • linux全方位掌握一個命令–思路比方法更重要

    Linux命令眾多,當不清楚一個命令的使用方法時,我們該怎樣了解命令的屬性和幫助? 1.  用type命令了解一個命令的屬性 [root@zejin240 testdir]# type cdcd is a shell builtin[root@zejin240 testdir]# type rmrm is aliased to `rm -i&#03…

    Linux干貨 2016-10-30
欧美性久久久久