久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

linux的sed命令如何使用

139次閱讀
沒有評論

共計 8496 個字符,預計需要花費 22 分鐘才能閱讀完成。

本篇內容主要講解“linux 的 sed 命令如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“linux 的 sed 命令如何使用”吧!

一、sed 介紹

sed 全稱(stream editor)流式編輯器,Sed 主要用來自動編輯一個或多個文件、簡化對文件的反復操作、編寫轉換程序等,工作流程如下

1、sed 概述

sed  是一種在線的、非交互式的編輯器,它一次處理一行內容,它是文本處理中非常好的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用 sed 命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出,或者使用 sed - i 選項
#- i 選項就是將本該輸出到屏幕上的內容輸出 / 流入文件中。Sed 主要用來自動編輯一個或多個文件,可以將數據行進行替換、刪除、新增、選取等特定工作,簡化對文件的反復操作,編寫轉換程序等

2、sed 格式

#sed 的命令格式: 
 sed [options]  command  file(s);
#sed 的腳本格式: 
 sed [options] -f scriptfile file(s);

 sed 和 grep 不一樣,不管是否找到指定的模式,它的退出狀態都是 0 只有當命令存在語法錯誤時,sed 的退出狀態才不是 0

二、sed 選項與基本用法 1、sed 選項

選項   功能
-e: # 允許多項編輯
-n: # 取消默認的輸出(模式空間的內容輸出), 只打印模式匹配的行;-i: #inplace,就地編輯, 直接修改文件內容;
-r: # 支持擴展元字符
-f: # 指定 sed 腳本文件名
- h 或 --help: # 顯示幫助;- V 或 --version: # 顯示版本信息

 sed -r  p  /etc/passwd  sed -r -n  p  /etc/passwd 
# 文件的一行行內容相當與水流,連續兩個 - e 就是設置了兩道關卡 [root@aliyun ~]# sed   test.txt  1111111 2222222egon 333333egon 444444egon 555555eon [root@aliyun ~]# sed -e  3d  -e  1d  test.txt  2222222egon 444444egon 555555eon [root@aliyun ~]# sed -rn -e  1,3d  -e  p  test.txt 444444egon 555555eon [root@aliyun ~]# 
555555eon [root@aliyun ~]#

2、sed 命令組成

命令由”地址 + 命令“兩部分組成,命令如 p、d,更多詳解第三章節,本節我們主要介紹地址

地址用于決定對流入模式空間的哪些行進行編輯,如果沒有指定地址,sed 將處理流入模式空間的所有行。

1)數字

sed -n  p  /etc/passwd 
sed -n  1,3p  /etc/passwd 
sed  1,47d  /etc/passwd

2)正則表達式

與 grep 一樣,sed 在文件中查找模式時也可以使用正則表達式 (RE) 和各種元字符。正則表達式是
括在斜杠間的模式,用于查找和替換,以下是 sed 支持的元字符。#  使用基本元字符集  
^, $, ., *, [], [^], \  \ ,\(\),\{\}
#  使用擴展元字符集  
?, +, { }, |, ( )
#  使用擴展元字符的方式:轉義,如 \+
- r 參數,如 sed -r
[root@aliyun ~]# cat test.txt 
1111111
2222222egon
333333egon
444444egon
555555eon
[root@aliyun ~]# sed -rn  /egon/p  test.txt 
2222222egon
333333egon
444444egon
[root@aliyun ~]#

3)數字 + 正則表達式

[root@aliyun ~]# cat test.txt 
1111111
2222222egon
333333egon
444444egon
555555eon
[root@aliyun ~]# sed -rn  1,/egon/p  test.txt 
1111111
2222222egon
[root@aliyun ~]# 
#  1,8p 代表打印 1 到 8 行,1,/egon/p 則代表取從第 1 行到首次匹配到 /egon/ 的行

3、cregexpc

地址可以是正則表達式,而正則表達式需要放置在 \c 與 c 中間,其中 c 可以是任意字符,但必須要加 \ 轉義

[root@aliyun ~]# cat test.txt 
1111111
2222222egon
333333egon
444444egon
555555eon
[root@aliyun ~]# sed -rn  #egon#p  test.txt 
[root@aliyun ~]# sed -rn  \#egon#p  test.txt 
2222222egon
333333egon
444444egon
[root@aliyun ~]#

如果 c 是左斜杠, 不需要轉義也可以

[root@aliyun ~]# sed -rn  \/egon/p  test.txt 
2222222egon
333333egon
444444egon
[root@aliyun ~]# sed -rn  /egon/p  test.txt 
2222222egon
333333egon
444444egon
[root@aliyun ~]#

如果匹配的正則里有左斜杠,要么將正則轉義,要么將 c 轉義

[root@aliyun ~]# cat a.txt 
/etc/egon/666
[root@aliyun ~]# sed -rn  //etc/egon/666/p  a.txt #  錯誤
sed: -e expression #1, char 0: no previous regular expression
 
[root@aliyun ~]# sed -rn  /\/etc\/egon\/666/p  a.txt #  正則轉義
/etc/egon/666
[root@aliyun ~]# sed -rn  #/etc/egon/666#p  a.txt #  轉義 c,必須是 \c
[root@aliyun ~]# sed -rn  \#/etc/egon/666#p  a.txt #  轉義 c
/etc/egon/666
[root@aliyun ~]# 

[root@aliyun ~]# sed -ri  /\/etc\/egon\/666/s/.*/xxx/  a.txt  [root@aliyun ~]# cat a.txt  [root@aliyun ~]#

三、sed 常用命令

sed 命令告訴 sed 對指定行進行何種操作,包括打印、刪除、修改等。

1、sed 常用的參數

命令   功能
a  在當前行后添加一行或多行
c  用新文本修改(替換)當前行中的文本
d  刪除行
i  在當前行之前插入文本
l  會用 $ 符號標識出文件中看不到的字符的位置
p  打印行
n  把下一行內容讀入模式空間,后續的處理命令處理的都是剛讀入的新內容
q  結束或退出 sed,不會將后續內容讀入模式空間
r  從文件中讀
!  對所選行以外的所有行應用命令
s  用一個字符串替換另一個
w  將行寫入文件
y  將字符轉換為另一字符(不支持正則表達式),y/egon/1234/ e- 1 g- 2 o- 3 n- 4
h  把模式空間里的內容復制到暫存緩沖區(覆蓋)
H  把模式空間里的內容追加到暫存緩沖區
g  取出暫存緩沖區的內容,將其復制到模式空間,覆蓋該處原有內容
G  取出暫存緩沖區的內容,將其復制到模式空間,追加在原有內容后面
N  追加下一個輸入行到模板塊后面并在二者間嵌入一個新行,改變當前行號碼;
x  交換暫存緩沖區與模式空間的內容
替換標志  s
g  在行內進行全局替換
i  忽略大小寫

 t label if 分支,從最后一行開始,條件一旦滿足或者 T,t 命令,將導致分支到帶有標號的命令處,或者到腳本的末尾;  T label  錯誤分支,從最后一行開始,一旦發生錯誤或者 T,t 命令,將導致分支到帶有標號的命令處,或者到腳本的末尾;  w file  寫并追加模板塊到 file 末尾;  W file  寫并追加模板塊的第一行到 file 末尾;  !  表示后面的命令對所有沒有被選定的行發生作用;  =  打印當前行號;  #  把注釋擴展到下一個換行符以前;
########################sed 替換標記 #######################  g  表示行內全面替換;  p  表示打印行;  w  表示把行寫入一個文件;  x  表示互換模板塊中的文本和緩沖區中的文本;  y  表示把一個字符翻譯為另外的字符(但是不用于正則表達式);    \1  子串匹配標記;     已匹配字符串標記;
######################sed 元字符集 ####################### ^  匹配行開始,如:/^sed/ 匹配所有以 sed 開頭的行;   $  匹配行結束,如:/sed$/ 匹配所有以 sed 結尾的行;    .  匹配一個非換行符的任意字符,如:/s.d/ 匹配 s 后接一個任意字符,最后是 d;    *  匹配 0 個或多個字符,如:/*sed/ 匹配所有模板是一個或多個空格后緊跟 sed 的行;    []  匹配一個指定范圍內的字符,如 /[ss]ed/ 匹配 sed 和 Sed;    [^]  匹配一個不在指定范圍內的字符,如:/[^A-RT-Z]ed/ 匹配不包含 A - R 和 T - Z 的一個字母開頭,緊跟 ed 的行;    \(..\)匹配子串,保存匹配的字符,如 s /\(love\)able/\1rs,loveable 被替換成 lovers;       保存搜索字符用來替換其他字符,如 s /love/** **/,love 這成 **love**;    \   匹配單詞的開始,如:/\   \   匹配單詞的結束,如 /love\ / 匹配包含以 love 結尾的單詞的行;    x\{m\}  重復字符 x,m 次,如:/0\{5\}/ 匹配包含 5 個 0 的行;    x\{m,\}  重復字符 x,至少 m 次,如:/0\{5,\}/ 匹配至少有 5 個 0 的行;    x\{m,n\}  重復字符 x,至少 m 次,不多于 n 次,如:/0\{5,10\}/ 匹配 5~10 個 0 的行;

2、sed 的實列

替換操作:s 命令
替換文本中的字符串: sed  s/book/books/  file
- n 選項和 p 命令一起使用表示只打印那些發生替換的行: sed -n  s/test/TEST/p  file
直接編輯文件選項 -i,會匹配 file 文件中每一行的第一個 book 替換為 books
 sed -i  s/book/books/g  file
全面替換標記 g
使用后綴  /g  標記會替換每一行中的所有匹配: sed  s/book/books/g  file
當需要從第 N 處匹配開始替換時,可以使用  /Ng: echo sksksksksksk | sed  s/sk/SK/2g  
 skSKSKSKSKSK
 echo sksksksksksk | sed  s/sk/SK/3g 
 skskSKSKSKSK 
 echo sksksksksksk | sed  s/sk/SK/4g 
 skskskSKSKSK 
以上命令中字符  /  在 sed 中作為定界符使用,也可以使用任意的定界符
 sed  s:test:TEXT:g  
 sed  s|test|TEXT|g  
定界符出現在樣式內部時,需要進行轉義: sed  s/\/bin/\/usr\/local\/bin/g 
刪除操作:d 命令
刪除空白行: sed  /^$/d  file
刪除文件的第 2 行: sed  2d  file
刪除文件的第 2 行到末尾所有行: sed  2,$d  file
刪除文件最后一行: sed  $d  file
刪除文件中所有開頭是 test 的行: sed  /^test/ d file
已匹配字符串標記 
正則表達式  \w\+  匹配每一個單詞,使用  [ ]  替換它,  對應于之前所匹配到的單詞: echo this is a test line | sed  s/\w\+/[ ]/g 
 [this] [is] [a] [test] [line] 
所有以 192.168.0.1 開頭的行都會被替換成它自已加 localhost: sed  s/^192.168.0.1/ localhost/  file 192.168.0.1localhost
子串匹配標記 \1
匹配給定樣式的其中一部分: echo this is digit 7 in a number | sed  s/digit \([0-9]\)/\1/  
 this is 7 in a number
命令中  digit 7,被替換成了  7。樣式匹配到的子串是  7,\(..\)  用于匹配子串,對于匹配到的第一個子串就標記為  \1,依此類推匹配到的第二個結果就是  \2,例如: echo aaa BBB | sed  s/\([a-z]\+\) \([A-Z]\+\)/\2 \1/  
 BBB aaa
love 被標記為 1,所有 loveable 會被替換成 lovers,并打印出來: sed -n  s/\(love\)able/\1rs/p  file
組合多個表達式
 sed  表達式  | sed  表達式   等價于: 
 sed  表達式;  表達式 
sed 表達式可以使用單引號來引用,但是如果表達式內部包含變量字符串,就需要使用雙引號。 test=hello 
 echo hello WORLD | sed  s/$test/HELLO  
 HELLO WORLD
選定行的范圍:,(逗號)所有在模板 test 和 check 所確定的范圍內的行都被打印: sed -n  /test/,/check/p  file
打印從第 5 行開始到第一個包含以 test 開始的行之間的所有行: sed -n  5,/^test/p  file
對于模板 test 和 west 之間的行,每行的末尾用字符串 aaa bbb 替換: sed  /test/,/west/s/$/aaa bbb/  file
多點編輯:e 命令
- e 選項允許在同一行里執行多條命令: sed -e  1,5d  -e  s/test/check/  file
上面 sed 表達式的第一條命令刪除 1 至 5 行,第二條命令用 check 替換 test。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那么第一個替換命令將影響第二個替換命令的結果。和  -e  等價的命令是  --expression: sed --expression= s/test/check/  --expression= /love/d  file
從文件讀入:r 命令
file 里的內容被讀進來,顯示在與 test 匹配的行后面,如果匹配多行,則 file 的內容將顯示在所有匹配行的下面: sed  /test/r file  filename
寫入文件:w 命令
 
在 example 中所有包含 test 的行都被寫入 file 里: sed -n  /test/w file  example
追加(行下):a\ 命令
將  this is a test line  追加到   以 test  開頭的行后面: sed  /^test/a\this is a test line  file
在  test.conf  文件第 2 行之后插入  this is a test line: sed -i  2a\this is a test line  test.conf 
插入(行上):i\ 命令   將  this is a test line  追加到以 test 開頭的行前面: sed  /^test/i\this is a test line  file
在 test.conf 文件第 5 行之前插入 this is a test line: sed -i  5i\this is a test line  test.conf
下一個:n 命令
如果 test 被匹配,則移動到匹配行的下一行,替換這一行的 aa,變為 bb,并打印該行,然后繼續: sed  /test/{ n; s/aa/bb/; }  file 
變形:y 命令
把 1~10 行內所有 abcde 轉變為大寫,注意,正則表達式元字符不能使用這個命令: sed  1,10y/abcde/ABCDE/  file
退出:q 命令
打印完第 10 行后,退出 sed sed  10q  file  保持和獲取:h 命令和 G 命令   在 sed 處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩沖區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將打印在屏幕上。接著模式空間被清空,并存入新的一行等待處理。 sed -e  /test/h  -e  $G  file 
在這個例子里,匹配 test 的行被找到后,將存入模式空間,h 命令將其復制并存入一個稱為保持緩存區的特殊緩沖區內。第二條語句的意思是,當到達最后一行后,G 命令取出保持緩沖區的行,然后把它放回模式空間中,且追加到現在已經存在于模式空間中的行的末尾。在這個例子中就是追加到最后一行。簡單來說,任何包含 test 的行都被復制并追加到該文件的末尾。保持和互換:h 命令和 x 命令
互換模式空間和保持緩沖區的內容。也就是把包含 test 與 check 的行互換: sed -e  /test/h  -e  /check/x  file 
腳本 scriptfile
sed 腳本是一個 sed 的命令清單,啟動 Sed 時以 - f 選項引導腳本文件名。Sed 對于腳本中輸入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多個命令,要用分號分隔。以 #開頭的行為注釋行,且不能跨行。 sed [options] -f scriptfile file(s)
打印奇數行或偶數行
 sed -n  n  test.txt # 奇數行  sed -n  p  test.txt # 偶數行  
 sed -n  1~2p  test.txt # 奇數行  sed -n  2~2p  test.txt # 偶數行  
打印匹配字符串的下一行
 grep -A 1 SCC URFILE 
 sed -n  /SCC/{n;p}  URFILE 
 awk  /SCC/{getline; print}

3、sed 命令示例

打印命令:p
# sed -r  /egon/p  a.txt 
# sed -r -n  /egon/p  a.txt
刪除命令:d,注意用單引號
# sed -r  3d  a.txt
# sed -r  3,$d  a.txt
# sed -r  $d  a.txt
# sed -r  /egon/d  a.txt 
# sed -r  1,/egon/{/egon/d}  a.txt #  只刪除模式匹配成功的第一行

[root@hzl ~]# 
[root@hzl ~]# sed -r  /egon/d  a.txt #  只刪除模式匹配成功的所有行
Egon111111
333Egon333
5555555555
6666666666
8888888888
[root@hzl ~]# sed -r  1,/egon/{/egon/d}  a.txt #  只刪除模式匹配成功的第一行
Egon111111
333Egon333
444444egon
5555555555
6666666666
egon777777
8888888888

# sed -r  s/egon/Bigegon/  a.txt 
# sed -r  s/egon/Bigegon/g  a.txt 
# sed -r  s/^egon/Bigegon/g  a.txt
# sed -r -n  s/root/egon/gip  /etc/passwd
# sed -r  s/[0-9]$/ .change/  a.txt #  代表取到匹配成功的整行內容
# sed -r  s/^([a-zA-Z]+)([^[a-zA-Z]+)/\2\1/  a.txt
# sed -r  s#egon#bigegon#g  a.txt 
多重編輯命令:e
# sed -r -e  1,3d  -e  s/[Ee]gon/EGON/g  a.txt #  在前一個 - e 的基礎之上進行第二個 - e 操作
# sed -r  1,3d;s/[Ee]gon/EGON/g  a.txt
# sed -r  3{s/[0-9]/x/g;s/[Ee]gon/EGON/g}  a.txt #  只處理第三行
# sed -r  1,3{s/[0-9]/x/g;s/[Ee]gon/EGON/g}  a.txt #  處理 1 到 3 行
# sed -r -n  p  a.txt # ; 分隔依次運行,先針對第一行進行 p 操作,再針對所有行進行 p 操作
# sed -r -n  1{p;p}  a.txt #  只針對第一行,連續進行兩次 p 操作
反向選擇!
# sed -r  3d  a.txt
# sed -r  3!d  a.txt

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-15發表,共計8496字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 汾阳市| 巴青县| 龙门县| 镇江市| 马边| 安平县| 策勒县| 台北市| 武隆县| 新蔡县| 政和县| 台南市| 内乡县| 南汇区| 和静县| 丹寨县| 武强县| 铜鼓县| 克拉玛依市| 平凉市| 石城县| 都江堰市| 高平市| 罗定市| 门源| 涡阳县| 项城市| 绥江县| 都安| 淮北市| 汝南县| 文登市| 三亚市| 泸州市| 新丰县| 慈利县| 泉州市| 陇南市| 开平市| 南宫市| 长沙县|