當(dāng)前位置:首頁(yè) > IT技術(shù) > 系統(tǒng)服務(wù) > 正文

linux sed 使用
2021-09-24 14:50:14

sed對(duì)文本的處理很強(qiáng)大,并且sed非常小,參數(shù)少,容易掌握,他的操作方式根awk有點(diǎn)像。sed按順序逐行讀取文件。然后,它執(zhí)行為該行指定的所有操作,并在完成請(qǐng)求的修改之后的內(nèi)容顯示出來(lái),也可以存放到文件中。完成了一行上的所有操作之后,它讀取文件的下一行,然后重復(fù)該過(guò)程直到它完成該文件。在這里要注意一點(diǎn),源文件(默認(rèn)地)保持不被修改。sed 默認(rèn)讀取整個(gè)文件并對(duì)其中的每一行進(jìn)行修改。說(shuō)白了就是一行一行的操作。我用sed主要就是用里面的替換功能,真的很強(qiáng)大。下面以實(shí)例,詳細(xì)的說(shuō)一下,先從替換開始,最常用的。

sed -h
?-n, --quiet, --silent??? 取消自動(dòng)打印模式空間
?-e 腳本, --expression=腳本?? 添加“腳本”到程序的運(yùn)行列表
?-f 腳本文件, --file=腳本文件? 添加“腳本文件”到程序的運(yùn)行列表
?--follow-symlinks??? 直接修改文件時(shí)跟隨軟鏈接
?-i[擴(kuò)展名], --in-place[=擴(kuò)展名]??? 直接修改文件(如果指定擴(kuò)展名就備份文件)
?-l N, --line-length=N?? 指定“l(fā)”命令的換行期望長(zhǎng)度
?--posix? 關(guān)閉所有 GNU 擴(kuò)展
?-r, --regexp-extended? 在腳本中使用擴(kuò)展正則表達(dá)式
?-s, --separate? 將輸入文件視為各個(gè)獨(dú)立的文件而不是一個(gè)長(zhǎng)的連續(xù)輸入
?-u, --unbuffered? 從輸入文件讀取最少的數(shù)據(jù),更頻繁的刷新輸出
?--help???? 打印幫助并退出
?--version? 輸出版本信息并退出

?

酷殼sed簡(jiǎn)明教程http://coolshell.cn/articles/9104.html

awk于1977年出生,今年36歲本命年,sed比awk大2-3歲,awk就像林妹妹,sed就是寶玉哥哥了。所以?林妹妹跳了個(gè)Topless,他的哥哥sed坐不住了,也一定要出來(lái)抖一抖。

sed全名叫stream editor,流編輯器,用程序的方式來(lái)編輯文本,相當(dāng)?shù)膆acker啊。sed基本上就是玩正則模式匹配,所以,玩sed的人,正則表達(dá)式一般都比較強(qiáng)。

同樣,本篇文章不會(huì)說(shuō)sed的全部東西,你可以參看sed的手冊(cè),我這里主要還是想和大家競(jìng)爭(zhēng)一下那些從手機(jī)指縫間或馬桶里流走的時(shí)間,用這些時(shí)間來(lái)學(xué)習(xí)一些東西。當(dāng)然,接下來(lái)的還是要靠大家自己雙手。

?

用s命令替換

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

1
2
3
4
5
6
7
8
9
$ cat pets.txt
This is my cat
??my cat's name is betty
This is my dog
??my dog's name is frank
This is my fish
??my fish's name is george
This is my goat
??my goat's name is adam

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

1
2
3
4
5
6
7
8
9
$ sed "s/my/Hao Chen's/g" pets.txt
This is Hao Chen's cat
??Hao Chen's cat's name is betty
This is Hao Chen's dog
??Hao Chen's dog's name is frank
This is Hao Chen's fish
??Hao Chen's fish's name is george
This is Hao Chen's goat
??Hao Chen's goat's name is adam

注意:如果你要使用單引號(hào),那么你沒辦法通過(guò)’這樣來(lái)轉(zhuǎn)義,就有雙引號(hào)就可以了,在雙引號(hào)內(nèi)可以用”來(lái)轉(zhuǎn)義。

?

再注意:上面的sed并沒有對(duì)文件的內(nèi)容改變,只是把處理過(guò)后的內(nèi)容輸出,如果你要寫回文件,你可以使用重定向,如:

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

或使用 -i 參數(shù)直接修改文件內(nèi)容:

1
$ sed -i "s/my/Hao Chen's/g" pets.txt

在每一行最前面加點(diǎn)東西:

1
2
3
4
5
6
7
8
9
$ sed 's/^/#/g' pets.txt
#This is my cat
#? my cat's name is betty
#This is my dog
#? my dog's name is frank
#This is my fish
#? my fish's name is george
#This is my goat
#? my goat's name is adam

在每一行最后面加點(diǎn)東西:

1
2
3
4
5
6
7
8
9
$ sed 's/$/ --- /g' pets.txt
This is my cat ---
??my cat's name is betty ---
This is my dog ---
??my dog's name is frank ---
This is my fish ---
??my fish's name is george ---
This is my goat ---
??my goat's name is adam ---

順手介紹一下正則表達(dá)式的一些最基本的東西:

  • ^ 表示一行的開頭。如:/^#/ 以#開頭的匹配。
  • $ 表示一行的結(jié)尾。如:/}$/ 以}結(jié)尾的匹配。
  • < 表示詞首。 如?<abc 表示以 abc 為首的詞。
  • > 表示詞尾。 如 abc> 表示以 abc 結(jié)尾的詞。
  • . 表示任何單個(gè)字符。
  • * 表示某個(gè)字符出現(xiàn)了0次或多次。
  • [ ] 字符集合。 如:[abc]表示匹配a或b或c,還有[a-zA-Z]表示匹配所有的26個(gè)字符。如果其中有^表示反,如[^a]表示非a的字符

正規(guī)則表達(dá)式是一些很牛的事,比如我們要去掉某html中的tags:

html.txt
1
<b>This</b> is what <span style="text-decoration: underline;">I</span> meant. Understand?

看看我們的sed命令

1
2
3
4
5
6
7
8
# 如果你這樣搞的話,就會(huì)有問(wèn)題
$ sed 's/<.*>//g' html.txt
?Understand?
?
# 要解決上面的那個(gè)問(wèn)題,就得像下面這樣。
# 其中的'[^>]' 指定了除了>的字符重復(fù)0次或多次。
$ sed 's/<[^>]*>//g' html.txt
This is what I meant. Understand?

我們?cè)賮?lái)看看指定需要替換的內(nèi)容:

1
2
3
4
5
6
7
8
9
$ sed "3s/my/your/g" pets.txt
This is my cat
??my cat's name is betty
This is your dog
??my dog's name is frank
This is my fish
??my fish's name is george
This is my goat
??my goat's name is adam

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

1
2
3
4
5
6
7
8
9
$ sed "3,6s/my/your/g" pets.txt
This is my cat
??my cat's name is betty
This is your dog
??your dog's name is frank
This is your fish
??your fish's name is george
This is my goat
??my goat's name is adam

?

1
2
3
4
5
$ cat my.txt
This is my cat, my cat's name is betty
This is my dog, my dog's name is frank
This is my fish, my fish's name is george
This is my goat, my goat's name is adam

只替換每一行的第一個(gè)s:

1
2
3
4
5
$ sed 's/s/S/1' my.txt
ThiS is my cat, my cat's name is betty
ThiS is my dog, my dog's name is frank
ThiS is my fish, my fish's name is george
ThiS is my goat, my goat's name is adam

只替換每一行的第二個(gè)s:

1
2
3
4
5
$ sed 's/s/S/2' my.txt
This iS my cat, my cat's name is betty
This iS my dog, my dog's name is frank
This iS my fish, my fish's name is george
This iS my goat, my goat's name is adam

只替換第一行的第3個(gè)以后的s:

1
2
3
4
5
$ sed 's/s/S/3g' my.txt
This is my cat, my cat'S name iS betty
This is my dog, my dog'S name iS frank
This is my fiSh, my fiSh'S name iS george
This is my goat, my goat'S name iS adam

?

替換多個(gè)文件:

sed -i '/1123/d' `find ./*`

sed -i 's/abc/xyz/g' xaa1 xab1

?

本文摘自 :https://blog.51cto.com/u

開通會(huì)員,享受整站包年服務(wù)立即開通 >