1
2
3
4
文字處理三劍客:
grep:egeep,fgrep:文字過濾器
sed:stream editor:流編輯器,逐行
awk:文字格式化工具,報告生成器
一、sed簡介
sed一次從檔案中讀取一行,不會修改原檔案的內容
sed命令將當前處理的行讀入模式空間(pattern space)進行處理,sed在該行上執行完所有命令後就將處理好的行列印到螢幕上(除非之前的命令刪除了該行)
sed處理完一行就將其從模式空間中刪除,然後將下一行讀入模式空間,進行處理、顯示。
處理完檔案的最後一行,sed便結束執行。sed在臨時緩衝區(模式空間)對檔案進行處理,所以不會修改原檔案,除非顯示指明-i選項。
放在sed的工作空間:pattern space 處理-->模式匹配-->匹配(則編輯->根據編輯命令是否輸出) //不匹配(stout)
輸出到-->stout
可以基於正規表示式進行文字過濾
把檔案的
檔案行資料流:--->|pattern space| //預設顯示沒有匹配到的行
v/ \
no yes
| / \
| / edit
| / |
v/ hold space
stdout
//sed空間:空間可以轉換
pattern space
hold space //處理的結果
sed [option] ... 'script' [input-file]... //輸入檔案可以有多個
script:位址定界+編輯命令
options:
-n ,--quiet,--slient不輸出模式空間的內容到螢幕
suppress:壓制,不讓
-e script, --expression=script //預設只有乙個script,實現多點編輯
-f script-file //指令碼檔案,每行乙個編輯命令
-r 支援擴充套件的正規表示式
-i 直接編輯原檔案
位址定界:
1.空位址,表示對全文進行處理
2.單位址,
# :指定行
/pattern/ :被此模式匹配到的每一行
3.位址範圍
#,# //起始位址
#,+# //向後幾行
#,/pattern/ //到pattern模式匹配結束
/pat1/,/pat2/ //斜線是預設的,必須有
4.步進:~
1~2 //所有的奇數行
2~2 //所有的偶數行
編輯命令:
d 刪除模式空間的內容
sed '/^uuid/d' /etc/fstab //刪除uuid開頭的行
sed '3d' /etc/fstab //刪除第3行
sed '1~2d' /etc/fstab //顯示偶數行,刪除奇數行
p 列印模式空間的內容
sed '1~2p' /etc/fstab //模式空間顯示兩遍,
//偶數行沒有被匹配,因此顯示
//奇數行被匹配到,預設為顯示
//edit後的操作是顯示
sed '1~2p' /etc/fstab -n //只顯示奇數行,模式空間的內容
a\test 追加 :在模式匹配到的行,下一行追加文字,支援使用,\n實現多行追加
後面追加
i\test:在行前面插入文字,支援使用\n實現多行插入
sed '3i \new line' fstab.t //不匹配到的行,預設也為輸出
sed '3a \new line\nanother line' fstab.t //插入兩行
sed '/uuid/a \# add new device base on uuid' fstab.t //在每一行的uuid前面都加了資訊
c\text:把匹配到的行替換為此處指定的文字"text";
主要: "/" 和 "\" 都可以使用
w /path/to/somewhere :儲存模式空間匹配到的行至指定的檔案中
sed -n '/^[^#]/w /tmp/fsatb.test' fstab //把非#開頭的行,儲存到檔案
r /path/to/somefile :讀取指定檔案的內容到當前檔案被模式匹配到的行中
sed '3r /etc/issue' fstab //在3行,讀入issue的內容
sed '/dev/r /etc/issue' fstab //匹配到的行,都讀入issue檔案內容
= 為模式空間匹配到的行,列印行號
sed '/dev/=' fstab
! 條件取反
sed '/^#/!d' /etc/fstab //模式取反
s/// :查詢替換,其分隔符可自行指定,常用的分隔符,s##,s@@,s///等
替換標記:
g:全域性替換
w /path/to/somefile:儲存到指定檔案
p:顯示替換成功的行
二、練習
1.刪除/boot/grub/grub2.cfg檔案中所有以空白開頭的行的行首的所有空白字元
2.刪除/etc/fstab檔案中所有以#開頭的行的行首的#號以及#號後面的空白字元
3.輸出乙個絕對路徑,取出其目錄,其行為類似於dirname
1.sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
2.sed 's@^#[[:space:]]*@@' /etc/fstab
sed 's@^#[[:space:]]*@@' -e '/^uuid/d' /etc/fstab
3.echo "/var/log/messages" | sed 's@[^/]\+$@@'
echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@' //基本的正規表示式,\?需要轉義:可有可無
echo "/var/log/messages/" | sed -r 's@[^/]+/?$@@' //擴充套件的正規表示式
三、高階編輯命令
sed工具簡介
基本上來說,sed是乙個可以分析standard input stdin 的資料,然後將資料經過處理後,再將它輸出到standard output stdout 的工具。比如取代,刪除,新增,選取特定行等等功能。語法基本上就是 sed nefr some actions here actions有a...
sed原理及sed命令格式
4.1 sed工作原理 sed是乙個非互動式的流編輯器。所謂非互動式,是指使用sed只能在命令列下輸入編輯命令來編輯文字,然後在螢幕上檢視輸出 而所謂流編輯器,是指sed每次只從檔案 或輸入 讀入一行,然後對該行進行指定的處理,並將結果輸出到螢幕 除非取消了螢幕輸出又沒有顯式地使用列印命令 接著讀入...
sed命令詳解
sed 是乙個精簡的 非互動式的編輯器。它能執行與編輯vi和emacs相同的編輯任務。sed編輯器不提供互動使用方式 只能在命令列輸入編輯命令 指定檔案 名,然後在螢幕上察看輸出。sed編輯器沒有破壞性。它不會修改檔案,除非用shell重定向來儲存輸出結果。預設情況下,所以的輸出都被列印到螢幕上。1...