1. 程式人生 > 實用技巧 >Linux shell 之 sed 命令詳解 第一部分

Linux shell 之 sed 命令詳解 第一部分

Linux shell 之 sed 命令詳解 第一部分

  sed編輯器被稱作流編輯器stream editor),和普通的互動式文字編輯器恰好相反。在互動式文字編輯器中(比如vim),你可以用鍵盤命令來互動式地插入、刪除或替換資料中的文字。流編輯器則會在編輯器處理資料之前基於預先提供的一組規則來編輯資料流。

  sed編輯器可以根據命令來處理資料流中的資料,這些命令要麼從命令列中輸入,要麼儲存在一個命令文字檔案中。 sed編輯器會執行下列操作。

    (1) 一次從輸入中讀取一行資料。

    (2) 根據所提供的編輯器命令匹配資料。

    (3) 按照命令修改流中的資料。

    (4) 將新的資料輸出到STDOUT

  在流編輯器將所有命令與一行資料匹配完畢後,它會讀取下一行資料並重復這個過程。在流編輯器處理完流中的所有資料行後,它就會終止。

  由於命令是按順序逐行給出的, sed編輯器只需對資料流進行一遍處理就可以完成編輯操作。這使得sed編輯器要比互動式編輯器快得多,你可以快速完成對資料的自動修改。

  sed命令的格式如下。

    sed options script file

  選項允許你修改 sed 命令的行為,可以使用的選項在下表中列出。

  script引數指定了應用於流資料上的單個命令。如果需要用多個命令,要麼使用-e選項在命令列中指定,要麼使用-f選項在單獨的檔案中指定。有大量的命令可用來處理資料。在

後面介紹一些sed編輯器的基本命令,後續會看到另外一些高階命令 。

命令格式:

1 sed的命令格式:sed [options] 'command' file(s);
2 
3 sed的指令碼格式:sed [options] -f scriptfile file(s);

選項

 -e :直接在命令列模式上進行sed動作編輯,此為預設選項;

 -f :將sed的動作寫在一個檔案內,用–f filename 執行 filename 內的 sed 動作;

 -i :直接修改檔案內容;

 -n :只打印模式匹配的行;

 -r :支援擴充套件表示式;

 -h或--help:顯示幫助;

 -V或--version:顯示版本資訊。

  1. 在命令列定義編輯器命令
  預設情況下, sed編輯器會將指定的命令應用到STDIN輸入流上。這樣你可以直接將資料通過管道輸入sed編輯器處理。這裡有個簡單的示例。

$ echo "This is a test" | sed 's/test/big test/'
This is a big test
$

  這個例子在sed編輯器中使用了s命令。 s命令會用斜線間指定的第二個文字字串來替換第一個文字字串模式。在本例中是big test替換了test

  sed 不加選項,預設選項就是 -e

1 $ cat data1.txt
2 the quick brown fox jumps over the lazy dog.
3 The quick brown fox jumps over the lazy dog.
4 The quick brown fox jumps over the lazy dog.
5 The quick brown fox jumps over the lazy dog.
6 $

1 $ sed 's/dog/cat/' data1.txt

1 The quick brown fox jumps over the lazy cat.
2 The quick brown fox jumps over the lazy cat.
3 The quick brown fox jumps over the lazy cat.
4 The quick brown fox jumps over the lazy cat.
5 $

  sed命令幾乎瞬間就執行完並返回資料。在處理每行資料的同時,結果也顯示出來了。可以sed編輯器處理完整個檔案之前就開始觀察結果。

  重要的是,要記住, sed編輯器並不會修改文字檔案的資料。它只會將修改後的資料傳送到STDOUT。如果你檢視原來的文字檔案,它仍然保留著原始資料。

1 $ cat data1.txt
2 The quick brown fox jumps over the lazy dog.
3 The quick brown fox jumps over the lazy dog.
4 The quick brown fox jumps over the lazy dog.
5 The quick brown fox jumps over the lazy dog.
6 $

  2. 在命令列使用多個編輯器命令

  要在sed命令列上執行多個命令時,只要用-e選項就可以了。

1 $ sed -e 's/brown/green/; s/dog/cat/' data1.txt
2 The quick green fox jumps over the lazy cat.
3 The quick green fox jumps over the lazy cat.
4 The quick green fox jumps over the lazy cat.
5 The quick green fox jumps over the lazy cat.
6 $

  兩個命令都作用到檔案中的每行資料上。命令之間必須用分號隔開,並且在命令末尾和分號之間不能有空格。

  如果不想用分號,也可以用 bash shell 中的次提示符來分隔命令。只要輸入第一個單引號標示出 sed 程式指令碼的起始( sed 編輯器命令列表), bash 會繼續提示你輸入更多命令,直到輸入了標示結束的單引號。

1 $ sed -e '
2 > s/brown/green/
3 > s/fox/elephant/
4 > s/dog/cat/' data1.txt
5 The quick green elephant jumps over the lazy cat.
6 The quick green elephant jumps over the lazy cat.
7 The quick green elephant jumps over the lazy cat.
8 The quick green elephant jumps over the lazy cat.
9 $

  必須記住,要在封尾單引號所在行結束命令。 bash shell一旦發現了封尾的單引號,就會執行命令。開始後, sed命令就會將你指定的每條命令應用到文字檔案中的每一行上。

  3、從檔案中讀取編輯器命令

  最後,如果有大量要處理的 sed 命令,那麼將它們放進一個單獨的檔案中通常會更方便一些。可以在 sed 命令中用 -f 選項來指定檔案。

 1 $ cat script1.sed
 2 s/brown/green/
 3 s/fox/elephant/
 4 s/dog/cat/
 5 $
 6 $ sed -f script1.sed data1.txt
 7 The quick green elephant jumps over the lazy cat.
 8 The quick green elephant jumps over the lazy cat.
 9 The quick green elephant jumps over the lazy cat.
10 The quick green elephant jumps over the lazy cat.
11 $

  在這種情況下,不用在每條命令後面放一個分號。 sed 編輯器知道每行都是一條單獨的命令。跟在命令列輸入命令一樣, sed 編輯器會從指定檔案中讀取命令,並將它們應用到資料檔案中的每一行上。

  我們很容易就會把sed編輯器指令碼檔案與 bash shell 指令碼檔案搞混。為了避免這種情況,可以使用 .sed 作為 sed 指令碼檔案的副檔名。

  -i、-r 將放到後面的部落格中講解,這篇幫助入門,簡單理解