linux三劍客之編輯器sed出廠

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第7天,點選檢視活動詳情

sed

  • linux三劍客grep、sed、awk 。不知道你瞭解多少?今天我們來聊聊三劍客之一的sed。
  • 我們可以將sed理解成一種編輯器。sed只是針對檔案進行編輯並將結果輸出在終端。整個過程對原始檔是不會做任何修改的。所以sed在某種程度上來說可以說是沒有破壞性的。但是sed又提供重定向來儲存結果,這個操作有可能破壞原始檔。

語法結構

參考

參考2

命令模式

sed [option] 'sed command' filename

指令碼模式

sed [option] -f 'sed script' filename

option列表

| 引數 | 含義 | | ------------------- | --------------------------------------------- | | -n | 僅將匹配的行打印出來 | | -e | 命令模式編輯內容,不影響原始檔 | | -f | 將sed命令提前寫在檔案中。-f進行載入 | | --follow-symlinks | 直接修改檔案時跟隨軟連結 | | -r | 支援擴充套件模式 ; 同grep -E | | -i | 修改原始檔內容。如果需要備份則-i "filename"表示備份到filename檔案 | | -a | 新增,在指定行後新增資料 |

image-20220611110536430.png

  • 通過圖中我們能夠看出來-e模式針對文字進行修改只是針對終端的。上面我們文字內容為hello。 -e模式先將hello修改為zxh,然後在修改為nihao。但是原始檔並沒有修改
  • 上面是sed的命令引數。在命令引數比如-i , -a需要編輯資料時,sed還提供了定位功能。下面我們簡稱編輯命令。

| 編輯命令 | 事例 | 功能 | | ---- | -------------------------------------------------------- | ----------------------------------------------- | | a | sed '3a\content' demo.txt或者sed '$a\content' demo.txt | 指定行後增加內容;3a表示第三行,$a最後一行。在ma c中\後面需要換行。 | | i | sed '3i\content' demo.txt | 指定行之前新增內容 | | c | sed '3c\hello' demo.txt | 修改指定行 | | d | sed '/number 1/,/number 3/d' data.txt | 刪除文字流中的特定行 | | n | sed '/content/n' demo.txt | 移動到選中的下一行 | | p | sed -n '2p' demo.txt | 列印資料。-n禁止,p 結合使用輸出匹配行 | | s | sed '2,$s/dog/cat/' demo.txt | 將內容替換成新內容 | | g | sed 's/dog/cat/g'demo.txt | 也是替換內容。全域性替換 s前指定範圍。g全域性 | | y | sed 'y/abc/ABC'demo.txt | 唯一可以處理單個字元的sed編輯器命令a-A,b-B,c-C | | w | sed '1,2w test.txt' demo.txt | write 。將流內容寫出到指定檔案中 ; 將demo.txt1,2行資料寫入test.txt | | r | sed '1,2r test.txt' demo.txt | read。將檔案內容讀到流中 | | l | sed -n 'l' demo.txt | 列表顯示 | | = | sed -n '=' demo.txt | 列印行號 | | {} | sed -n '{=;s/dog/cat/g;p}' | 組合擴充套件;分號切割 |

  • 在mac中我們使用編輯模式新增內容時需要如下操作

a

image-20220613164113139.png

i

image-20220613164814557.png

c

image-20220613164752991.png

d

image-20220613173534545.png

l

image-20220613174737375.png

{}

image-20220613175220746.png

n

image-20220613192123260.png

常用指令碼

查詢文字中是否包含某內容

echo /bin/bashtesth | sed -n '%/bin/bash% p'

正則查詢某內容

echo helloworld | sed -n '/^hell/ p'  echo helloworld | sed -n '/ld$/ p'

查詢2,4行資料

cat demo.txt | sed -n '2,4p'

正則匹配

  • 作為新手的我總感覺Linux中的正則和Java中正則有點不太一樣。Linux里正則用著不是很舒服。.*^${}+?|()這些和java一樣都是特殊字元。
  • java中匹配所有事.*而Linux中.直接就可以匹配所有
  • [] 匹配指定範圍內任意字元
  • [^] 匹配出指定範圍外任意字元
  • echo 12345 | sed -n '/[0-9]+/p'這個並不能匹配;echo 12345|sed -n '/[0-9][0-9][0-9][0-9][0-9]/p'可以匹配。這是因為sed和grep一樣需要-E 開啟擴充套件正則echo 12345 | sed -n =E '/[0-9]+/p'

| 特殊含義 | 解釋 | | ----------- | ----------------------------------- | | [[:alpha:]] | 匹配任意字母字元,不管是大寫還是小寫(等價於[a-zA-Z]) | | [[:alnum:]] | 匹配任意字母數字字元0~9、A~Z或a~z(等價於A-Za-z0-9) | | [[:blank:]] | 匹配空格或製表符 | | [[:digit:]] | 匹配0~9之間的數字(等價於[0-9]) | | [[:lower:]] | 匹配小寫字母字元a~z(等價於[a-z]) | | [[:print:]] | 匹配任意可列印字元 | | [[:punct:]] | 匹配標點符號 | | [[:space:]] | 匹配任意空白字元:空格、製表符、NL、FF、VT和CR | | [[:upper:]] | 匹配任意大寫字母字元A~Z(等價於[A-Z]) |

三劍客還剩下一位grep ; 江湖有緣再見

「其他文章」