linux-shell指令碼命令之sed

來源:互聯網
上載者:User

[ sed簡介: ]

sed是一個很好的檔案處理工具, 它本身是一個管道命令, 以行為單位進行處理, 可以用於對資料行進行新增、選取、替換、刪除等操作。sed命令列格式:sed [-nefri] 'range command' file如: sed '2d' aaa.txt                                   # 刪除檔案aaa.txt中第二行

[ sed工作流程: ]

使用vim這種螢幕編輯器編輯一個檔案的時候, 我們需要把這個檔案開啟, 這裡存在兩個問題:1. 開啟一個比較大的檔案會消耗很多記憶體。2. 我們無法寫指令碼調用vim來編輯檔案, 但是sed可以通過寫指令碼編輯檔案。
sed屬於流編輯器, 它在編輯檔案的時候, 首先會把檔案的一行內容讀入記憶體,讀入記憶體的部分, 稱為模式空間;  然後根據我們的需要進行編輯,編輯完後會把模式空間的內容輸出到螢幕, 並把它裡面的內容清空, 再讀取下一行到模式空間, 這樣的話就避免了一次性讀取整個檔案。

[ sed常用選項: ]

-n: 只會顯示模式空間裡的內容, 而不會顯示沒有編輯過的內容。-e: 直接在指令列模式上進行 sed 的動作編輯;-f: 直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的sed 動作;-r: sed 的動作支援的是延伸型正規標記法的文法。( 預設是基礎正規標記法文法 )-i: 直接修改讀取的檔案內容, 而不是由螢幕輸出。 

[ sed常用命令: ]

d: 刪除, 因為是刪除, 所以 d 後面通常不接任何東西;

s: 替代, 可以直接進行替換的工作, 通常這個 s 的動作可以搭配正規標記法;

a: 追加, a 的後面可以接字串, 而這些字串會在新的一行出現(目前的下一行);

i:  插入, i 的後面可以接字串, 而這些字串會在新的一行出現(目前的上一行);

c: 取代, c 的後面可以接字串, 這些字串可以取代一行內容;


[ 常用命令舉例: ]

## 刪除操作 d :  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

range是範圍, 刪除操作有兩種方法表示:① 直接寫一個數字, 表示對多少行進行操作.                       sed '2d' aaa.txt             #表示刪除檔案aaa.txt中第二行② 使用Regex,  此時必須要使用兩個反斜線 // 隔開.   sed '/^Tom/d' aaa.txt  # 表示刪除aaa.txt中以Tom開頭的行* 如果沒有指定範圍, 則會對全文進行操縱.                         sed 'd' aaa.txt               # 表示刪除aaa.txt中所有的行

1.  sed '$d' aaa.txt                                 # 刪除aaa.txt中最後一行 (對單行進行操作)
2. sed '7,9d' aaa.txt                              # 刪除檔案aaa.txt中第七行到第九行 (對多行進行操作)
3. sed '/aaa/,/bbb/d' aaa.txt                # 刪除檔案aaa.txt中含有aaa至含有bbb之間所有的行 (對多行進行操作)

## 替代操作 s :  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 

替換格式:  sed 'range s/orig/new/sign' file      # 如果沒有指定範圍的話, 將會對全文進行操作. 

1. sed 's/aaa/bbb/' ccc.txt                   # 將ccc.txt全文中每行的第一個關鍵字 aaa 替換成 bbb, 因為我們沒有指定任何模式
2. sed 's/aaa/bbb/g' ccc.txt                # 將ccc.txt全文中所有 aaa 替換成 bbb, 因為我們加了sign: g
3. sed 's/aaa/bbb/2' ccc.txt               # 將ccc.txt全文中每行第二個 aaa 替換成 bbb, 因為我們加了sign: 2
4. sed '1s/aaa/bbb/g' ccc.txt              # 將ccc.txt全文中第一行所有 aaa 替換成 bbb, 因為我們加了range: 1, 加了sign: g

5. 上面樣本也可以用其他字元隔開(只有替換有):   sed 's#aaa#bbb#' ccc.txt
6. old位置支援正則, 但在new位置不支援正則, 除了字元 \n \&
   sed '1s/a/N&N/2' ccc.txt               # 將ccc.txt全文中第一行第二個 a 替換成NaN, & 相當於對前面 a 的引用

7. 對特定的範圍做多個操作, 那麼我們要把多個操作用 { } 括起來, 用 ; 隔開多個命令.
   sed '1{s/a/b/g; s/b/c/}' ccc.txt      # 先將ccc.txt全文中第一行所有 a 替換成 b, 再將第一行第一個關鍵字 b 替換成 c

8. 上面所講都是替換一個單詞, 如果我們想替換某個字元, 那麼可以使用 y 命令
   sed '1y/abc/xyz/' ccc.txt               # 將ccc.txt中全文第一行所有 a 替換成 x, b 替換成 y, c 替換成 z

## 追加操作 a :   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.  sed '/ab/a\xxx' ccc.txt                # 將ccc.txt中含有 ab 的行下面再插入一行字串xxx
2. sed '1a zhang\njim' ccc.txt           # 在ccc.txt中第一行下面插入zhang再在下一行插入jim, \n 起換行作用

## 插入操作 i :   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1. sed '/ab/i\xxx' ccc.txt                 # 將ccc.txt中含有 ab 的行上面再插入一行字串xxx
2. sed '$a abc' ccc.txt                     # 在ccc.txt中最後一行插入abc

## 取代操作 c :   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1. sed '/ab/cAB=AB' ccc.txt             # 將ccc.txt中含有 ab 的行整行替換成AB=AB
2. sed '1c ab' ccc.txt                        # 將ccc.txt中第一行整行替換成ab

## 顯示模式空間 p :   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1. sed '$a abc p' ccc.txt                   # 將模式空間和檔案中的內容都顯示在螢幕上

[ sed其他命令: ]

1. = 為顯示行號

   sed '/^abc/{=}' ccc.txt                 #  以abc開頭的關鍵詞所在的行號


2. n 為擷取下一行 (當前行從模式空間刪除, 下一行讀入模式空間)

   sed '/^a/ {n;s/b/B/g}' ccc.txt     # 匹配以a開頭的下一行整行, 使用 B 替換 b.


3. N 為讀取多行內容到模式空間: (當前行和下一行都在模式空間中)

   sed '/^A/{s/tb/TB/; N; s/t\nb/TB \n/}' ccc.txt     # 匹配以 A 開頭的行, 將tb替換成TB; 再讀取下一行, 將當前行的t和下一行的b替換成TB


4. 使用多行模式空間的話, ^ 就不是行的開頭, 而是模式空間的開頭; $ 就不是行的結尾, 而是模式空間的結束.

    替換前:a b c d e             替換後:A b c d e
                  a b c d e                            a b c d e
    sed 'N; s/^a/A/' ddd.txt           # 第一行和第二行都會被讀入模式空間, 但只有第一行的 a 會被替換成 A, 第二行的 a 並不會被替換.

    替換前:a b c d e             替換後: a b c d e
                  a b c d e                            a b c d E
    sed 'N; s/e$/E/' ddd.txt          # 第一行和第二行都會被讀入模式空間, 但只有第二行的 e 會被替換成 E, 第一行的 e 並不會被替換.


5. 除了模式空間, 還有保持空間, 我們可以把它理解成一個緩衝. 保持空間的內容和模式空間的內容可以互換

    h : 把模式空間內容儲存到保持空間; G : 把保持空間裡面的內容儲存到模式空間;

    替換前:a                        替換後:b
                  b                                      a
                  aa                                    bb
                  bb                                    aa
    sed '/a/{h; d}; /b/{G}' eee.txt # 匹配含有 a 的那一行,把它們儲存在保持空間並從模式空間刪除;匹配含有b的那一行,把保持空間內容放到模式空間;

6. set裡面沒有迴圈, 如果想實現迴圈的效果, 可以藉助標籤



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.