sed(流編輯器,行編輯器)
是一種流編輯器,一次處理一行內容,處理時把當前處理的行存儲在臨時緩存中,成為“模式空間”,接著用sed命令處理緩沖區的內容,處理完畢后吧緩沖區內容輸出到屏幕接著處理下一行。這樣不斷重復到末尾。文件內容并沒有改變。除非使用重定向輸出才會改變內容。
sed:行編輯器(全屏編輯器:vi)
\\把制定行提取到內存中編輯,編輯完成后,顯示在屏幕上。
sed:模式空間
##默認不編輯源文件,僅對模式空間中的數據做處理;而后,處理結束后,將模式空間打印至屏幕。
用法:
sed [option]… 'script' inputfile…
常用選項:
-n:不輸出模式空間內容的自動打印
-e: 多點編輯
-f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本
-r: 支持使用擴展正則表達式
-i: 原處編輯
script:
'地址命令'
地址定界:
(1) 不給地址:對全文進行處理
(2) 單地址:
#: 指定的行
pattern/:被此處模式所能夠匹配到的每一行
(3) 地址范圍:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步進
1~2 奇數行
2~2 偶數行
編輯命令:
d: 刪除模式空間匹配的行 p: 顯示模式空間中的內容 a \text:在行后面追加文本;支持使用\n實現多行追加 i \text:在行前面插入文本;支持使用\n實現多行插入 c \text:替換行為單行或多行文本 w /path/to/somefile: 保存模式匹配的行至指定文件 r /path/from/somefile:讀取指定文件的文本至模式空 # sed -i.bak '/^U/r /etc/issue' f3 //-i.bak表示把f3這個文件備份,然后在把/etc/issue這個文件讀入f3間中匹配到的行后 =: 為模式空間中的行打印行號 # sed '/^UUID/p' /testdir/f3 !:模式空間中匹配行取反處理 v # sed '/^UUID/!d' /testdir/f3 == # sed -n '/UUID/p' /testdir/f3 s///:查找替換,支持使用其它分隔符, s@@@, s### 替換標記: g: 行內全局替換 p: 顯示替換成功的行 w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中 |
例子// sed ‘2p’ /etc/passwd
sed –n ‘2p’ /etc/passwd
sed –n ‘1,4p’ /etc/passwd
sed –n ‘/root/p’ /etc/passwd
sed –n ‘2,/root/p’ /etc/passwd 從2行開始
sed -n ‘/^$/=’ file 顯示空行行號
sed –n –e ‘/^$/p’ –e ‘/^$/=’ file
sed ‘/root/a\superman’ /etc/passwd行后
sed ‘/root/i\superman’ /etc/passwd 行前
sed ‘/root/c\superman’ /etc/passwd 代替行
高級編輯命令:
h: 把模式空間中的內容覆蓋至保持空間中 H:把模式空間中的內容追加至保持空間中 g: 從保持空間取出數據覆蓋至模式空間 G:從保持空間取出內容追加至模式空間 x: 把模式空間中的內容與保持空間中的內容進行互換 n: 讀取匹配到的行的下一行覆蓋至模式空間 N:追加匹配到的行的下一行至模式空間 d: 刪除模式空間中的行 D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed |
sed -n 'n;p' FILE
sed ‘/^$/d’ file
sed ‘1,10d’ file
nl /etc/passwd | sed ‘2,5d’
nl /etc/passwd | sed ‘2a tea’
sed 's/test/mytest/g' example
sed –n‘s/root/&superman/p’ /etc/passwd 單詞后
sed –n‘s/root/superman&/p’ /etc/passwd 單詞前
sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
sed –i.bak ‘s/dog/cat/g’ pets
sed '1!G;h;$!d' FILE
sed '$!N;$!D' FILE
sed '$!d' FILE
sed ‘G’ FILE
sed ‘g’ FILE
sed ‘/^$/d;G’ FILE
sed 'n;d' FILE
sed -n '1!G;h;$p' FILE
語法
# sed [options] 'AddressCommand' file …
"options:
-n:不顯示模式空間中的行
-i:直接修改源文件
-e SCRIPT -e SCRIPT:可以同時執行多個腳本
-f /PATH/TO/SED_SCRIPT:
# sed -f /path/to/sed_script
-r:表示使用擴展正則表達式
"Address:
1、StartLine,EndLine
比如1,100行
$:最后一行
2、/RegExp/
/^root/
3、/pattern1/,/pattern2/
\\第一次被pattern1匹配到的行開始,至第一次被pattern2匹配到的行結束,這中間的所有行。
4、LineNumber
\\指定的行,精確某行。
5、StartLine,+N
\\從startLine開始,向后的N行;。
"Command:
d:刪除符合條件的行
# sed '1,2d' /etc/fstab
p:顯示符合條件的行
a \string:在指定的行后面追加新行,內容為string
\\'\n':可以換行。
i \string:在指定的行前面追加新行,內容為string
r FILE:將指定范圍內的內容添加至符合條件的行處
w FILE:將指定范圍內的內容另存至指定的文件中
s/pattern/string/修飾符:查找并替換,默認至替換每行中第一次被模式匹配到的字符串
加修飾符
g:全局替換
i:忽略字符大小寫
s///:s@@@,s%%%,s###
&:引用模式匹配整個串
# sed 's#l..e#&r#g' sed.txt \\表示在匹配到的字符串中加入指定內容。
# sed 's#\(l..e\)#\1r#g' sed.txt \\同上。
sed練習:
1、刪除/etc/grub.conf文件中行首的空白符;
# sed 's#^[[:space:]]##g' /etc/grub.conf
2、刪除/etc/inittab文件中的空白行;
# sed '/^$/d' /etc/inittab
3、替換/etc/inittab文件中"id:3:initdefault:"一行中的數字為5;
# sed 's@\(id:\)[0-9](\:initdefault:\)@\15@\2g' /etc/inittab
4、刪除/etc/inittab文件中開頭的#號;
# sed 's@^#@@g' /etc/inittab
5、刪除某文件中開頭的#號及后面的空白字符,但要求#號后面必須有空白字符;
# sed -r 's@^#[[:space:]]+@@g' /etc/inittab
6、刪除某文件中以空白字符后面跟#類的行中的開頭的空白字符及#;
# sed -r 's@^[[:space:]]+#@@g' /etc/inittab
7、取一個文件路徑的目錄名稱
# echo "/etc/rc.d" | sed -r 's@^(/.*/)[^/]+/?@\1@g'
保留文件的基明
# echo "/etc/rc.d" | sed -r 's@^/.*/([^/]+)/?@\1@g'
原創文章,作者:皺 多利亞,如若轉載,請注明出處:http://www.www58058.com/34290