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

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

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

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

?

酷殼sed簡明教程http://coolshell.cn/articles/9104.html

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

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

同樣,本篇文章不會說sed的全部東西,你可以參看sed的手冊,我這里主要還是想和大家競爭一下那些從手機指縫間或馬桶里流走的時間,用這些時間來學習一些東西。當然,接下來的還是要靠大家自己雙手。

?

用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,下面的語句應該很好理解(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

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

?

再注意:上面的sed并沒有對文件的內(nèi)容改變,只是把處理過后的內(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

在每一行最前面加點東西:

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

在每一行最后面加點東西:

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 ---

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

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

正規(guī)則表達式是一些很牛的事,比如我們要去掉某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
# 如果你這樣搞的話,就會有問題
$ sed 's/<.*>//g' html.txt
?Understand?
?
# 要解決上面的那個問題,就得像下面這樣。
# 其中的'[^>]' 指定了除了>的字符重復0次或多次。
$ sed 's/<[^>]*>//g' html.txt
This is what I meant. Understand?

我們再來看看指定需要替換的內(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

只替換每一行的第一個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

只替換每一行的第二個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個以后的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

?

替換多個文件:

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

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

?

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

開通會員,享受整站包年服務立即開通 >