sed 命令

sed是stream editor的簡稱,也就是流編輯器。它一次處理一行內容,處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有 改變,除非你使用重定向存儲輸出。

sed命令的使用規則是這樣的:

sed [option] 'command' input_file

其中option是可選的,常用的option有如下幾種:

  • -n 使用安靜(silent)模式(想不通爲什麼不是-s)。在一般sed的用法中,所有來自stdin的內容一般都會被列出到屏幕上。但如果加上-n參數後,則只有經過sed特殊處理的那一行(或者動作)纔會被列出來;

  • -e 直接在指令列模式上進行 sed 的動作編輯;

  • -f 直接將 sed 的動作寫在一個文件內, -f filename 則可以執行filename內的sed命令;

  • -r 讓sed命令支持擴展的正則表達式(默認是基礎正則表達式);

  • -i 直接修改讀取的文件內容,而不是由屏幕輸出。

    常用的命令有以下幾種:

  • a \: append即追加字符串, a \的後面跟上字符串s(多行字符串可以用\n分隔),則會在當前選擇的行的後面都加上字符串s;

  • c \: 取代/替換字符串,c \後面跟上字符串s(多行字符串可以用\n分隔),則會將當前選中的行替換成字符串s;

  • d: delete即刪除,該命令會將當前選中的行刪除;

  • i \: insert即插入字符串,i \後面跟上字符串s(多行字符串可以用\n分隔),則會在當前選中的行的前面都插入字符串s;

  • p: print即打印,該命令會打印當前選擇的行到屏幕上;

  • s: 替換,通常s命令的用法是這樣的:1,2s/old/new/g,將old字符串替換成new字符串

  • $ cat test.txt
    this is first line
    this is second line
    this is third line
    this is fourth line
    this fifth line
    happy everyday
    end



  • $ sed '1a \add one' test.txt

  • 本例命令部分中的1表示第一行,同樣的第二行寫成2,第一行到第三行寫成1,3,用$表示最後一行,

    比如2,$表示第二行到最後一行中間所有的行(包含第二行和最後一行)。
    本例的作用是在第一行之後增加字符串”add one”,從輸出可以看到具體效果。

  • $ sed '1,$a \add one' test.txt

  • 本例表示在第一行和最後一行所有的行後面都加上”add one”字符串,從輸出可以看到效果。

  • $ sed '/first/a \add one' test.txt

  • 本例表示在包含”first”字符串的行的後面加上字符串”add one”,從輸出可以看到第一行包含first,

    所以第一行之後增加了”add one”

  • $ sed '/^ha.*day$/a \add one' test.txt

  • 本例使用正則表達式匹配行,^ha.*day$表示以ha開頭,以day結尾的行,

    則可以匹配到文件的”happy everyday”這樣,所以在該行後面增加了”add one”字符串。

  • $ sed '$c \add one' test.txt

  • 本例表示將最後一行替換成字符串”add one”,從輸出可以看到效果。

  • $ sed '4,$c \add one' test.txt

  • 本例將第四行到最後一行的內容替換成字符串”add one”。

  • $ sed '/^ha.*day$/c \replace line' test.txt

  • 本例將以ha開頭,以day結尾的行替換成”replace line”。

  • $ sed '/^ha.*day$/d' test.txt

  • 本例刪除以ha開頭,以day結尾的行。

  • $ sed '4,$d' test.txt

  • 本例刪除第四行到最後一行中的內容。

  • $ sed -n '4,$p' test.txt

  • 本例在屏幕上打印第四行到最後一行的內容,p命令一般和-n選項一起使用。

  • $ sed -n '/^ha.*day$/p' test.txt

  • 本例打印以ha開始,以day結尾的行。

  • $ sed 's/line/text/g' test.txt

  • 本例將文件中的所有line替換成text,最後的g是global的意思,也就是全局替換,如果不加g,

    則只會替換本行的第一個line。

  • $ sed '/^ha.*day$/s/happy/very happy/g' test.txt

  • 本例首先匹配以ha開始,以day結尾的行,本例中匹配到的行是”happy everyday”這樣,

    然後再將該行中的happy替換成very happy。

  • $ sed 's/\(.*\)line$/\1/g' test.txt

  • $ sed 's/\(.*\)is\(.*\)line/\1\2/g' test.txt



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