以前用vim操作文檔的時候,可以查找也可以替換,但只限于在文本內部操作,而不能輸出到屏幕上。sed工具以及后面要介紹的awk工具就能把替換的文本輸出到屏幕上,而且還有其他更豐富的功能。
12.2.1打印某行
sed命令的格式為:sed -n 'n'p filename,單引號內的n是一個數字,表示第幾行。-n選項的作用是只顯示我們要打印的行,無關緊要的內容不顯示。示例命令如下:
# sed -n '2'p /etc/passwd bin1bin:/bin:/sbin/nologin你可以去掉-n選項對比一下差異。要想把所有行都打印出來,可以使用命令sed -n '1,$'p filename,如下所示:
# sed -n '1,$'p test.txt rot0/rot:/bin/bash operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
當然,我們也可以指定一個區間打印,如下所示:
# sed -n '1,3'p test.txt rot0/rot:/bin/bash operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin
12.2.2打印包含某個字符串的行
示例命令如下:
# sed -n '/root/'p test.txt operator11operator:/root:/sbin/nologin這種用法就類似于grep了,在grep中使用的特殊字符(如^、$、.、*等)同樣也能在sed中使用,如下所示:
# sed -n '/^1/'p test.txt 1111111111111111111111111111111 # sed -n '/in$/'p test.txt operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin # sed -n '/r..o/'p test.txt operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash # sed -n '/ooo*/'p test.txt operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash
sed命令加上-e選項可以實現多個行為,如下所示:
# sed -e '1'p -e '/111/'p -n test.txt rot0/rot:/bin/bash 1111111111111111111111111111111
12.2.3刪除某些行
示例命令如下:
# sed '1'd test.txt operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa # sed '1,3'd test.txt roooot0/rooooot:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa # sed '/oot/'d test.txt rot0/rot:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa這里參數d表示刪除的動作,它不僅可以刪除指定的單行以及多行,而且可以刪除匹配某個字符的行,還可以刪除從某一行開始到文檔最后一行的所有行。
不過,這個操作僅僅是在顯示器屏幕上并不顯示這些行而已,文檔還好好的,請不要擔心。
12.2.4替換字符或者字符串
示例命令如下:
# sed '1,2s/ot/to/g' test.txt rto0/rto:/bin/bash operator11operator:/roto:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa上例中的參數s就表示替換的動作,參數g表示本行全局替換,如果不加g則只替換本行出現的第一個,這個用法其實和vim的替換大同小異。 除了可以使用/作為分隔符外,我們還可以使用其他特殊字符,例如#和@。如下所示:
# sed 's#ot#to#g' test.txt rto0/rto:/bin/bash operator11operator:/roto:/sbin/nologin operator11operator:/rooto:/sbin/nologin roooto0/rooooto:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa # sed 's@ot@to@g' test.txt rto0/rto:/bin/bash operator11operator:/roto:/sbin/nologin operator11operator:/rooto:/sbin/nologin roooto0/rooooto:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
現在思考一下:如何刪除文檔中所有的數字或者字母?示例命令如下:
# sed 's/[0-9]//g' test.txt rot::/rot:/bin/bash operator:/root:/sbin/nologin operator:/rooot:/sbin/nologin roooot::/rooooot:/bin/bash aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[0-9]表示任意的數字。這里你也可以寫成[a-zA-Z]或者[0-9a-zA-Z]。如下所示:
# sed 's/[a-zA-Z]//g' test.txt :0:/:// :0::/:// :0::/:// :0:/:// 1111111111111111111111111111111
12.2.5調換兩個字符串的位置
示例命令如下:
# sed 's/(rot)(.*)(bash)/321/' test.txt bash0/rot:/bin/rot operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa小括號在sed中屬于特殊符號,必須在前面加轉義字符,替換時則寫成類似1、2或3的形式。上例中用()把想要替換的字符打包成了一個整體。
有這個轉義字符,會讓這個表達式看起來亂糟糟的,阿銘有個方法可以省略它。如下所示:
# sed -r 's/(rot)(.*)(bash)/321/' test.txt bash0/rot:/bin/rot operator11operator:/root:/sbin/nologin operator11operator:/rooot:/sbin/nologin roooot0/rooooot:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa沒錯,正如你看到的,就是這個-r選項讓這個表達式更加清晰了,-r的作用跟grep的-E的作用是一樣的,它讓sed支持擴展正則,擴展正則其實就是使用了諸如:()、{}、|、+、?等特殊符號的正則。
除了調換兩個字符串的位置,阿銘還常常用sed在某一行前后增加指定內容,如下所示:
# sed 's/^.*$/123&/' test.txt 123rot0/rot:/bin/bash 123operator11operator:/root:/sbin/nologin 123operator11operator:/rooot:/sbin/nologin 123roooot0/rooooot:/bin/bash 1231111111111111111111111111111111 123aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
12.2.6直接修改文件的內容
示例命令如下:
# sed -i 's/ot/to/g' test.txt # cat test.txt rto0/rto:/bin/bash operator11operator:/roto:/sbin/nologin operator11operator:/rooto:/sbin/nologin roooto0/rooooto:/bin/bash 1111111111111111111111111111111 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa這樣就可以直接更改test.txt文件中的內容了。但必須注意,在修改前最好先備份一下文件,以免改錯。 好了,我總結了這些,你看還有補充的么?
審核編輯:劉清
-
顯示器
+關注
關注
21文章
4948瀏覽量
139826 -
BIN文件
+關注
關注
0文章
26瀏覽量
8268 -
grep
+關注
關注
0文章
22瀏覽量
4716
原文標題:sed工具常見用法我總結了這些
文章出處:【微信號:aming_linux,微信公眾號:阿銘linux】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論