linux,linux系統下載

來源:互聯網
上載者:User

linux,linux系統下載

sed全名叫stream editor,流編輯器,用程式的方式來編輯文本,相當的hacker啊。sed基本上就是玩正則模式比對,所以,玩sed的人,Regex一般都比較強。

用s命令替換

使用下面的這段文本做示範:

$ cat pets.txtThis is my catmy cat's name is bettyThis is my dogmy dog's name is frankThis is my fishmy fish's name is georgeThis is my goatmy goat's name is adam

把其中的my字串替換成Hao Chen’s,下面的語句應該很好理解(s表示替換命令,/my/表示匹配my,/Hao Chen’s/表示把匹配替換成Hao Chen’s,/g 表示一行上的替換所有的匹配):

把其中的my字串替換成Hao Chen’s,下面的語句應該很好理解(s表示替換命令,/my/表示匹配my,/Hao Chen’s/表示把匹配替換成Hao Chen’s,/g 表示一行上的替換所有的匹配):

注意:如果你要使用單引號,那麼你沒辦法通過\’這樣來轉義,就有雙引號就可以了,在雙引號內可以用\”來轉義。

再注意:上面的sed並沒有對檔案的內容改變,只是把處理過後的內容輸出,如果你要寫迴文件,你可以使用重新導向,如:

$ sed"s/my/Hao Chen's/g"pets.txt > hao_pets.txt

或使用 -i 參數直接修改檔案內容:

$ sed -i "s/my/Hao Chen's/g" pets.txt
Regex的一些最基本的東西
  • ^ 表示一行的開頭。如:/^#/ 以#開頭的匹配。
  • $ 表示一行的結尾。如:/}$/ 以}結尾的匹配。
  • \< 表示詞首。 如 \<abc 表示以 abc 為首的詞。
  • \> 表示詞尾。 如 abc\> 表示以 abc 結尾的詞。
  • . 表示任何單個字元。
  • * 表示某個字元出現了0次或多次。
  • [ ] 字元集合。 如:[abc]表示匹配a或b或c,還有[a-zA-Z]表示匹配所有的26個字元。如果其中有^表示反,如[^a]表示非a的字元

去掉某html中的tags:

html.txt

< code>b<This</>b< is what < code>spanstyle="text-decoration: underline;"<I</>span< meant. Understand?

看看我們的sed命令

# 如果你這樣搞的話,就會有問題

$ sed 's/< >//g' html.txtUnderstand?

# 要解決上面的那個問題,就得像下面這樣。

# 其中的'[^<]' 指定了除了<的字元重複0次或多次。

$ sed 's/<[^>]*>//g' html.txtThis is what I meant. Understand?

我們再來看看指定需要替換的內容:

$ sed"3s/my/your/g"pets.txtThis is my catmy cat's name is bettyThis is your dogmy dog's name is frankThis is my fishmy fish's name is georgeThis is my goatmy goat's name is adam

下面的命令只替換第3到第6行的文本。

$ sed "3,6s/my/your/g"pets.txtThis is my catmy cat's name is bettyThis is your dogyour dog's name is frankThis is your fishyour fish's name is georgeThis is my goatmy goat's name is adam

只替換每一行的第一個s:

$ sed 's/s/S/1' my.txtThiS is my cat, my cat's name is bettyThiS is my dog, my dog's name is frankThiS is my fish, my fish's name is georgeThiS is my goat, my goat's name is adam

只替換每一行的第二個s:

$ sed's/s/S/2'my.txtThis iS my cat, my cat's name is bettyThis iS my dog, my dog's name is frankThis iS my fish, my fish's name is georgeThis iS my goat, my goat's name is adam

只替換第一行的第3個以後的s:

$ sed's/s/S/3g'my.txtThis is my cat, my cat'S name iS bettyThis is my dog, my dog'S name iS frankThis is my fiSh, my fiSh'S name iS georgeThis is my goat, my goat'S name iS adam
多個匹配

如果我們需要一次替換多個模式,可參看下面的樣本:(第一個模式把第一行到第三行的my替換成your,第二個則把第3行以後的This替換成了That)

$ sed '1,3s/my/your/g; 3,$s/This/That/g'my.txtThis is your cat, your cat's name is bettyThis is your dog, your dog's name is frankThat is your fish, your fish's name is georgeThat is my goat, my goat's name is adam

上面的命令等價於:(註:下面使用的是sed的-e命令列參數)

Sed -e  '1,3s/my/your/g' -e  '3,$s/This/That/g' my.txt

我們可以使用&來當做被匹配的變數,然後可以在基本左右加點東西。如下所示:

$ sed 's/my/[&]/g' my.txtThis is [my] cat, [my] cat's name is bettyThis is [my] dog, [my] dog's name is frankThis is [my] fish, [my] fish's name is georgeThis is [my] goat, [my] goat's name is adam
圓括弧匹配

使用圓括弧匹配的樣本:(圓括弧括起來的Regex所匹配的字串會可以當成變數來使用,sed中使用的是\1,\2…)

$ sed 's/This is my \([^,]*\),.*is \(.*\)/\1:\2/g' my.txtcat:bettydog:frankfish:georgegoat:adam

上面這個例子中的Regex有點複雜,解開如下(去掉逸出字元):

正則為:This is my ([^,]*),.*is (.*)
匹配為:This is my (cat),……….is(betty)

然後:\1就是cat,\2就是betty

sed的命令

回到最一開始的例子pets.txt,讓我們來看幾個命令:

$ cat pets.txtThis is my catmy cat's name is bettyThis is my dogmy dog's name is frankThis is my fishmy fish's name is georgeThis is my goatmy goat's name is adam
N命令

先來看N命令 —— 把下一行的內容納入當成緩衝區做匹配。

下面的的樣本會把原文本中的偶數行納入奇數行匹配,而s只匹配並替換一次,所以,就成了下面的結果:

$ sed'N;s/my/your/'pets.txtThis is your catmy cat's name is bettyThis is your dogmy dog's name is frankThis is your fishmy fish's name is georgeThis is your goatmy goat's name is adam

也就是說,原來的檔案成了:

This is my cat\n  my cat's name is bettyThis is my dog\n  my dog's name is frankThis is my fish\n  my fish's name is georgeThis is my goat\n  my goat's name is adam

這樣一來,下面的例子你就明白了,

$ sed'N;s/\n/,/'pets.txtThis is my cat,  my cat's name is bettyThis is my dog,  my dog's name is frankThis is my fish,  my fish's name is georgeThis is my goat,  my goat's name is adam
a命令和i命令

a命令就是append, i命令就是insert,它們是用來添加行的。如:

# 其中的1i表明,其要在第1行前插入一行(insert)$ sed "1 i This is my monkey, my monkey's name is wukong"my.txtThis is my monkey, my monkey's name is wukongThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam# 其中的1a表明,其要在最後一行後追加一行(append)$ sed"$ a This is my monkey, my monkey's name is wukong"my.txtThis is my cat, my cat's name is bettyThis is my monkey, my monkey's name is wukongThis is my dog, my dog's name is frankThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam

我們可以運用匹配來添加文本:

# 注意其中的/fish/a,這意思是匹配到/fish/後就追加一行$ sed"/fish/a This is my monkey, my monkey's name is wukong"my.txtThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my fish, my fish's name is georgeThis is my monkey, my monkey's name is wukongThis is my goat, my goat's name is adam
c命令

c 命令是替換匹配行

$ sed "2 c This is my monkey, my monkey's name is wukong" my.txtThis is my cat, my cat's name is bettyThis is my monkey, my monkey's name is wukongThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam$ sed"/fish/c This is my monkey, my monkey's name is wukong"my.txtThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my monkey, my monkey's name is wukongThis is my goat, my goat's name is adam

 

d命令

刪除匹配行

$ sed'/fish/d'my.txtThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my goat, my goat's name is adam$ sed'2d'my.txtThis is my cat, my cat's name is bettyThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam$ sed'2,$d'my.txtThis is my cat, my cat's name is betty

 

p命令

列印命令

你可以把這個命令當成grep式的命令

# 匹配fish並輸出,可以看到fish的那一行被打了兩遍,# 這是因為sed處理時會把處理的資訊輸出$ sed'/fish/p'my.txtThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my fish, my fish's name is georgeThis is my fish, my fish's name is georgeThis is my goat, my goat's name is adam# 使用n參數就好了$ sed -n '/fish/p'my.txtThis is my fish, my fish's name is george# 從一個模式到另一個模式$ sed -n '/dog/,/fish/p'my.txtThis is my dog, my dog's name is frankThis is my fish, my fish's name is george#從第一行列印到匹配fish成功的那一行$ sed-n '1,/fish/p'my.txtThis is my cat, my cat's name is bettyThis is my dog, my dog's name is frankThis is my fish, my fish's name is george

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.