sed常用命令及命令n/N詳解

sed的語法格式:

sed [option] {sed-command} {input-file}


sed在正常情況下,將處理的行讀入模式空間(pattern space),腳本中的“sed-command(sed命令)”就一條接着一條進行處理,知道腳本執行完畢。然後該行唄輸出,模式(pattern space)被清空;接着,在重複執行剛纔的動作,文件中的新的一行被讀入,直到文件處理完畢。

但是,由於種種原因,如用戶希望在某個條件下,腳本中的某個命令被執行或希望模式空間(pattern space)保留,以便下一次使用,這都有可能使sed在處理文件的時候,不按照正常的流程來進行處理,這時候就需要用sed高級命令來滿足需求。

 

先來說說命令n和命令N

命令n:讀取下一行到pattern space。由於pattern space中有按照正常流程讀取的內容,使用n命令後,pattern space中又有了一行,此時,pattern space中有2行內容,但是先讀取的那一行不會被取代、覆蓋或刪除;當n命令後,還有其他命令p的時候,此時打印出的結果是n命令讀取的那一行的內容。

看下圖,你就明白了。

新建文件,其內容如下

cat 1.txt

1

2

正常sed流程

使用n命令後,

3.jpg

N命令:將下一行添加到pattern space中。將當前讀入行和用N命令添加的下一行看成“一行”。

新建文件1.txt

cat 1.txt

1

2

正常sed流程

4.png

使用N命令後

5.png

=========================================================

2、sed選項 option
   -n    使用安靜模式.則只有經過sed特殊處理的哪一行纔會被列出來
   -e    傳送帶(前面執行完傳遞給後面)
   -f    跟隨腳本文件名
   -r    脫意
   -i    直接修改讀取文件

3、sed命令詳解 command
   a     新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
   c     取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
   d     刪除,因爲是刪除啊,所以 d 後面通常不接任何咚咚;
   i      插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
   p     列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~
   s     取代,通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 
   n    讀取下一個輸入行, 用下一個命令處理新的行

   r     從另一個文件讀

4、以下是替換標記
  g    表示行內全面替換
  p    表示打印行
  w    表示把行寫入一個文件
  x    表示互換模快板中的文本和緩衝區中的文本
  y    表示把一個字符翻譯爲另外的字符(不用於正則表達式)

5、元字符集,匹配符
^       錨定行的開始. 如/^sed/ 匹配所有以sed開頭的行
$       錨定行的結束. 如/sed$/ 匹配所有以sed結尾的行
.         匹配一個非換行符. 如/*sed/ 匹配s後接一個任意字符然後是d
*        匹配零或多個字符. 如/*sed/ 匹配所有模塊是一個或多個空格後緊跟sed的行
[]      匹配一個制定範圍內的字符如. /[Ss]ed/ 匹配sed和Sed
[^]    匹配一個不在制定範圍內的字符. 如/[^A-RT-Z]ed/ 匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行
\(..\)        保存匹配的字符. 如s/\(love\)able/\1rs loveable被替換成lovers
&              保存搜索字符用來替換其它字符. 如s/love/**&**/ love這成**love**
\<             錨定單詞的開始. 如/\\> 錨定單詞的結束. 如/love\>匹配包含以love結尾的單詞行
x\{m\}       重複字符x,m次. 如/o\{5\}匹配包含5個o的行
x\{m,\}      重複字符x,至少m次. 如 /o\{5,}/匹配至少有5個o的行
x\{m,n\}    重複字符x,至少m次.把多餘n次. 如 /o\{5,10\}/匹配5-10個o的行

6、sed中查找模式匹配
.            單字通配符
[0-9]      匹配0-9
[^a-z]    不匹配a-z的所有其它字符
“.*”         匹配””內任何字符串
^            匹配行開始
$            匹配行結束

7、例子
刪除: dd命令
sed ‘2d’ file                 刪除file文件的第2行
sed ‘2,$d’ file             刪除file文件的第2行到末尾所有行
sed ‘$d’ file                刪除file文件的最後一行
sed ‘/test/’d file         刪除file文件所有包含test的行
sed d file                   刪除file文件中的所有行

替換: s命令
sed ‘s/test/mytest/g’ file        在整行範圍內把test替換爲mytest. 如果沒有g標記,則只有每行第一個匹配的test被替換成mytest
sed -n ‘s/^test/mytest/p’ file        -n選項和p標誌一起使用表示只打印那些發生替換的行, 如果某一行開頭的test被替換成mytest,就打印它
sed ‘s/^192.168.1.1/&localhost’ file    &符號表示替換字符串中被找到的部分. 所有以192.168.1.1開頭的行都會被替換成它自己加localhost,變成192.168.1.1localhost
sed -n ‘s/\(love\)able/\1rs/p’ file    love被標記爲1,所有loveable會被替換成lovers,而且替換的行會被打印出來
sed ‘s#10#100#g’ file            不論什麼字符,緊跟着s的命令都被認爲是最新的分隔符,所以,’#’在這裏是分隔符,代替了默認的”/”分隔符. 表示把所有10替換成100

選定行的範圍: 逗號
sed -n ‘/test/,/check/p’ file        所有在模塊test和check所確定範圍內的行都被打印
sed -n ‘5,/^test/p’ file                 打印從第5行開始到第一個包含以test開始行之間的所有行
sed ‘/test/,/west/s/$/sed test/’ file    對於模塊test和west之間的行,每行的末尾用字符串sed test替換

多點編輯: e命令
sed -e ‘1,5d’ -e ‘s/test/check/’ file    -e選項允許在同一行裏執行多條命令.刪除1-5行,check替換test
sed -e ‘/and/s/aaa/bbb’ file           sed中用bbb替換同一行中包括字符串and的字符串aaa,而不是每一行中的字符串aaa

讀入文件: r命令
sed ‘/test/r file_a’ file        file_a裏的內容被讀進來,顯示在與test匹配的行後面. 如果匹配多行,則file_a內容將顯示在所有匹配行的下面

寫入文件: w命令
sed -n ‘test/w file_a’ file        file中所包含的test行都被寫入file裏

插入: i命令
sed ‘/test/i\\ new line’ file        如果test被匹配, 則把反斜槓後面的文本插入到匹配行的上面
sed -e ‘1 ia’ -e ‘$ a3′ file             在第一行上面插入a,在末尾行下面插入3

下一個: n命令
sed ‘/test/{n; s/aa/bb/;}; file        如果test被匹配, 則移動到匹配行的下一行,替換這一行的aa變爲bb, 並打印該行,然後繼續




轉載:https://www.cnblogs.com/276815076/p/5237886.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章