天天看點

sed和tr基本用法

sed:(Stream Editor)流編輯器。它是行編輯器,處理純ASCII碼文本,實作逐行進行處理文本。

sed編輯特性

它并不直接處理文本檔案本身,處理檔案時逐行讀取,把符合模式條件的行讀取到記憶體空間中,而後在記憶體中完成編輯,并且把編輯的結果輸出到螢幕上。記憶體空間又稱為模式空間。處理文本是做模式過濾,符合模式條件文本進行處理,不符合的不予處理。sed還有一種叫保留白間,屬于進階功能。

sed預設不編輯原檔案,僅對模式空間中的資料做處理,處理完成後,将模式空間中的内容列印至螢幕

(全屏編輯器:vi)

sed文法格式

sed [options] 'AddressCommand' file1 file2 ...

注意:位址和編輯指令之間不需要加空格

選項:
        -n:靜默模式,隻把經過sed指令處理的行輸出到螢幕
        -i: 将修改直接寫入原檔案,而不是輸出到螢幕
        -e SCRIPT -e SCRIPT:可以同時執行多個腳本(sed的位址和編輯指令稱為腳本)
        -f 腳本檔案名: 從sed腳本中讀入sed操作
        -r: 表示使用擴充正規表達式
           

位址(Address)界定表示方法

  1. StartLine,EndLine 起始行和結束行用逗号隔開,
例:1,100表示從第一行到第100行
$ :表示最後一行
$-1:表示倒數第二行
           
  1. /RegExp/ 使用正規表達式來指定模式,用雙斜杠将模式包含在内,這裡的模式就是正規表達式。
例:/^root/ 比對所處理檔案中所有以root開頭的行
           
  1. /pattern1/,/pattern2/ 模式1,模式2

    這種方式表示從第一次被模式1比對的行開始,至第一次由模式2比對的行結束,這中間的所有行

  2. LineNumber 指定行号,精确比對某行
  3. StartLine,+N

    從startline開始,向後的N行。

指令(Command)

d: 删除符合條件的行

p: 顯示符合條件的行

a \string: 在指定的行後面追加新行,内容為“string(字元串)”,字元串中間如果有空格,需要用雙引号包含

\n: 可以用于換行
i \string: 在指定的行前面添加新行,内容為string

r FILE(檔案名): 将指定的檔案的内容添加至符合條件的行處
例:sed '3r /etc/issue' /etc/fstab

w FILE(檔案名):将指定範圍内的内容另存至指定的檔案中
例:sed '/^#/w a.txt' anaconda-ks.cfg

s/pattern/string/: 查找并替換,預設隻替換每行中第一次被模式比對到的字元串,格式:“行範圍s/舊字元/新字元/”
加修飾符:
s/pattern/string/修飾符:
           

修飾符

g:全局替換
i: 查找時忽略字元大小寫
例:df -h | sed 's/\//#/g'
//将全文的"/"替換為“#”
注:s指令後的分割符不僅限于“/”,可以換為3個#号或3個@符号,隻要是3個同樣的符号即可
例:[root@cgy12 ~]# df -h | sed 's$/$#$g'
    Filesystem      Size  Used Avail Use% Mounted on
    #dev#sda3       8.7G  3.8G  4.5G  47% #
    tmpfs           295M     0  295M   0% #dev#shm
    #dev#sda1       194M   34M  151M  19% #boot
           

後項引用

\{\},\1,\2
&:引用模式比對到的整個字元串
    l..e : like-->liker
           love-->lover
例:[root@cgy15 ~]# sed 's/l..e/&r/' test.txt 
    hello liker
    hello lover
    //比對以l開頭,e結尾,中間任意兩個字元的字元串;将比對到的字元串後面加上r

或者還可以這樣:
例:[root@cgy15 ~]# sed 's%\(l..e\)%\1r%' test.txt 
    hello liker
    hello lover

将做如下修改:
    like-->Like
    love-->Love
例:[root@cgy15 ~]# sed 's#l\(..e\)#L\1#' test.txt 
    hello Like
    hello Love

           

tr指令的用法

[root@cgy15 ~]# tr --help
用法:tr [選項]... SET1 [SET2]
從标準輸入中替換、縮減和/或删除字元,并将結果寫到标準輸出。

  -c, -C, --complement      首先補足SET1
  -d, --delete          删除比對SET1 的内容,并不作替換
  -s, --squeeze-repeats 如果比對于SET1 的字元在輸入序列中存在連續的
                重複,在替換時會被統一縮為一個字元的長度
  -t, --truncate-set1       先将SET1 的長度截為和SET2 相等
      --help        顯示此幫助資訊并退出
      --version     顯示版本資訊并退出


SET 是一組字元串,一般都可按照字面含義了解。解析序列如下:

  \NNN  八進制值為NNN 的字元(1 至3 個數位)
  \\        反斜杠
  \a        終端鳴響
  \b        倒退
  \f        換頁
  \n        換行
  \r        回車
  \t        水準制表符
  \v        垂直制表符
  字元1-字元2   從字元1 到字元2 的升序遞增過程中經曆的所有字元
  [字元*] 在SET2 中适用,指定字元會被連續複制直到吻合設定1 的長度
  [字元*次數]   對字元執行指定次數的複制,若次數以 0 開頭則被視為八進制數
  [:alnum:] 所有的字母和數字
  [:alpha:] 所有的字母
  [:blank:] 所有呈水準排列的空白字元
  [:cntrl:] 所有的控制字元
  [:digit:] 所有的數字
  [:graph:] 所有的可列印字元,不包括空格
  [:lower:] 所有的小寫字母
  [:print:] 所有的可列印字元,包括空格
  [:punct:] 所有的标點字元
  [:space:] 所有呈水準或垂直排列的空白字元
  [:upper:] 所有的大寫字母
  [:xdigit:]    所有的十六進制數
  [=字元=]    所有和指定字元相等的字元