命令列與Shell -> 文字處理命令之sed
以 Redhat6.0 為測試環境事實上在solaris下的sed命令要比linux強,但因為沒有測試
環境,我這裡只給在 linux下經過測試的用法。
目錄:
★ 命令列引數簡介
★ 首先假設我們有這樣一個文字檔案 sedtest.txt
★ 輸出指定範圍的行 p
★ 在每一行前面增加一個製表符(^I)
★ 在每一行後面增加--end
★ 顯示指定模式匹配行的行號 [/pattern/]=
★ 在匹配行後面增加文字 [/pattern/]a\ 或者 [address]a\
★ 刪除匹配行 [/pattern/]d 或者 [address1][,address2]d
★ 替換匹配行 [/pattern/]c\ 或者 [address1][,address2]c\
★ 在匹配行前面插入文字 [/pattern/]i\ 或者 [address]i\
★ 替換匹配串(注意不再是匹配行) [addr1][,addr2]s/old/new/g
★ 限定範圍後的模式匹配
★ 指定替換每一行中匹配的第幾次出現
★ &代表最後匹配
★ 利用sed修改PATH環境變數
★ 測試並提高sed命令執行效率
★ 指定輸出檔案 [address1][,address2]w outputfile
★ 指定輸入檔案 [address]r inputfile
★ 替換相應字元 [address1][,address2]y/old/new/
★ !號的使用
★ \c正規表示式c 的使用
★ sed命令中正規表示式的複雜性
★ 轉換man手冊成普通文字格式(新)
★ sed的man手冊(用的就是上面的方法)
★ 命令列引數簡介
sed
-e script. 指定sed編輯命令
-f scriptfile 指定的檔案中是sed編輯命令
-n 寂靜模式,抑制來自sed命令執行過程中的冗餘輸出資訊,比如只
顯示那些被改變的行。
不 明白?不要緊,把這些骯髒丟到一邊,跟我往下走,不過下面的介紹裡
不包括正規表示式的解釋,如果你不明白,可能有點麻煩。
★ 首先假設我們有這樣一個文字檔案 sedtest.txt
cat > sedtest.txt
Sed is a stream editor
----------------------
A stream editor is used to perform. basic text transformations on an input stream
--------------------------------------------------------------------------------
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
sed works by making only one pass over the input(s), and is consequently more
-----------------------------------------------------------------------------
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
--------------------------------------------------------------------------------
-
★ 輸出指定範圍的行 p other types of editors.
sed -e "1,4p" -n sedtest.txt
sed -e "/from/p" -n sedtest.txt
sed -e "1,/from/p" -n sedtest.txt
★ 在每一行前面增加一個製表符(^I)
sed "s/^/^I/g" sedtest.txt
注意^I的輸入方法是ctrl-v ctrl-i
單個^表示行首
★ 在每一行後面增加--end
sed "s/$/--end/g" sedtest.txt
單個$表示行尾
★ 顯示指定模式匹配行的行號 [/pattern/]=
sed -e '/is/=' sedtest.txt
1
Sed is a stream editor
----------------------
3
A stream editor is used to perform. basic text transformations on an input stream
--------------------------------------------------------------------------------
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
7
sed works by making only one pass over the input(s), and is consequently more
-----------------------------------------------------------------------------
9
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
--------------------------------------------------------------------------------
-
-
意思是分析sedtest.txt,顯示那些包含is串的匹配行的行號,注意11行中出現了is字串
這個 輸出是面向stdout的,如果不做重定向處理,則不影響原來的sedtest.txt
★ 在匹配行後面增加文字 [/pattern/]a\ 或者 [address]a\
^D
sed -f sedadd.script. sedtest.txt
Sed is a stream editor
A stream editor is used to perform. basic text transformations on an input stream
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
sed works by making only one pass over the input(s), and is consequently more
-----------------------------------------------------------------------------
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
--------------------------------------------------------------------------------
-
-
[scz@ /home/scz/src]> sed -e "a\\
+++++++++
---------------------------------------------
找到包含from字串的行,在該行的下一行增加+++++++++。
這個輸出是面向stdout的,如果不做重定向處理, 則不影響原來的sedtest.txt
很多人想在命令列上直接完成這個操作而不是多一個sedadd.script,不幸的是,這需要 用?nbsp;
?nbsp;
續行符\,
[scz@ /home/scz/src]> sed -e "/from/a\\
> +++++++++" sedtest.txt
[scz@ /home/scz/src]> sed -e "a\\
> +++++++++" sedtest.txt
上面這條命令將在所有行後增加一個新 行+++++++++
[scz@ /home/scz/src]> sed -e "1 a\\
> +++++++++" sedtest.txt
把下面這兩行copy/paste到一個shell命令列上,效果一樣
+++++++++" sedtest.txt
[address]a\ 只接受一個地址指定
對於a命令,不支援單引號,只能用雙引號,而 對於d命令等其他命令,同時
★ 刪除匹配行 [/pattern/]d 或者 [address1][,address2]d
sed -e '/---------------------------------------------/d' sedtest.txt
Sed is a stream editor
A stream editor is used to perform. basic text transformations on an input stream
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
sed works by making only one pass over the input(s), and is consequently more
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
sed -e '6,10d' sedtest.txt
刪除6-10行的內容,包括6和10
sed -e "2d" sedtest.txt
刪除第2行的內容
sed "1,/^$/d" sedtest.txt
刪除從第一行到第一 個空行之間的所有內容
注意這個命令很容易帶來意外的結果,當sedtest.txt中從第一行開始並沒有空行,則sed刪
?nbsp;
?nbsp;
sed "1,/from/d" sedtest.txt
刪除從第一行到第一個包含from字串的 行之間的所有內容,包括第一個包含
from字串的行。
★ 替換匹配行 [/pattern/]c\ 或者 [address1][,address2]c\
sed -e "/is/c\\
**********" sedtest.txt
尋找所有包含is字串的匹配行,替換成**********
**********
----------------------
**********
--------------------------------------------------------------------------------
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
**********
-----------------------------------------------------------------------------
**********
--------------------------------------------------------------------------------
-
sed -e "1,11c\\
**********" sedtest.txt----------------------
在1-12行內搜尋所有from字串,分別替換成****字串
★ 限定範圍後的模式匹配
sed "/But/s/is/are/g" sedtest.txt
對那些包含But字串的行, 把is替換成are
sed "/is/s/t/T/" sedtest.txt
對那些包含is字串的行,把每行第一個出現 的t替換成T
sed "/While/,/from/p" sedtest.txt -n
輸出在這兩個模式匹配行之間的所有 內容
★ 指定替換每一行中匹配的第幾次出現
sed "s/is/are/5" sedtest.txt
把 每行的is字串的第5次出現替換成are
★ &代表最後匹配
sed "s/^$/(&)/" sedtest.txt
給所有空行增加一對()
sed "s/is/(&)/g" sedtest.txt
給 所有is字串外增加()
sed "s/.*/(&)/" sedtest.txt
給所有行增加一對()
sed "/is/s/.*/(&)/" sedtest.txt
給所有包含is字串的行增加一對()
★ 利用sed修改PATH環境變數
先檢視PATH環境變數
[scz@ /home/scz/src]> echo $PATH
/usr/bin:/usr/bin:/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/X11R6/bin:.
去掉尾部的{ :/usr/X11R6/bin:. }
[scz@ /home/scz/src]> echo $PATH | sed "s/^\(.*\):\/usr[/]X11R6\/bin:[.]$/\1/"
/usr/bin:/usr/bin:/bin:/usr/local/bin:/sbin:/usr/sbin
去掉中間的{ :/bin: }
[scz@ /home/scz/src]> echo $PATH | sed "s/^\(.*\):\/bin:\(.*\)$/\1\2/"
/usr/bin:/usr/bin/usr/local/bin:/sbin:/usr/sbin:/usr/X11R6/bin:.
[/]表示/失去特殊意義
\/同樣表示/失去意義
\1表示子匹配的第一次出現
\2表示子匹配的第二次出 現
\(.*\)表示子匹配
去掉尾部的:,然後增加新的路徑
PATH=`echo $PATH | sed 's/\(.*\):$/\1/'`:$HOME/src
注意反引號`和單引號'的區別。
★ 測試並提高sed命令執行效率
time sed -n "1,12p" webkeeper.db > /dev/null
time sed 12q webkeeper.db > /dev/null
可以看出後者比前者效率高。
[address]q 當碰上指定行時退出sed執行
★ 指定輸出檔案 [address1][,address2]w outputfile
sed "1,10w sed.out" sedtest.txt -n
將sedtest.txt中1-10行的內容寫到sed.out檔案中。
★ 指定輸入檔案 [address]r inputfile
sed "1r sedappend.txt" sedtest.txt
將 sedappend.txt中的內容附加到sedtest.txt檔案的第一行之後
★ 替換相應字元 [address1][,address2]y/old/new/
sed "y/abcdef/ABCDEF/" sedtest.txt
將sedtest.txt中所有的abcdef小寫字母替換成ABCDEF大寫字母。
★ !號的使用
sed -e '3,7!d' sedtest.txt
刪除3-7行之外的所有行
sed -e '1,/from/!d' sedtest.txt
找到包含from字串的行,刪除其後的所有行
★ \c正規表示式c 的使用
sed -e "\:from:d" sedtest.txt
等價於 sed -e "/from/d" sedtest.txt
★ sed命令中正規表示式的複雜性
cat > sedtest.txt
^\/[}]{.*}[\(]$\)
^D
如何才能把該行替換成
\(]$\)\/[}]{.*}^[
★ 轉換man手冊成普通文字格式(新)
man sed | col -b > sed.txt
sed -e "s/^H//g" -e "/^$/d" -e "s/^^I/ /g" -e "s/^I/ /g" sed.txt > sedman
.
txt
刪除所有退格鍵、空行,把行首的製表符替換成8個空格,其餘製表符替換成一個空格。
環境,我這裡只給在 linux下經過測試的用法。
目錄:
★ 命令列引數簡介
★ 首先假設我們有這樣一個文字檔案 sedtest.txt
★ 輸出指定範圍的行 p
★ 在每一行前面增加一個製表符(^I)
★ 在每一行後面增加--end
★ 顯示指定模式匹配行的行號 [/pattern/]=
★ 在匹配行後面增加文字 [/pattern/]a\ 或者 [address]a\
★ 刪除匹配行 [/pattern/]d 或者 [address1][,address2]d
★ 替換匹配行 [/pattern/]c\ 或者 [address1][,address2]c\
★ 在匹配行前面插入文字 [/pattern/]i\ 或者 [address]i\
★ 替換匹配串(注意不再是匹配行) [addr1][,addr2]s/old/new/g
★ 限定範圍後的模式匹配
★ 指定替換每一行中匹配的第幾次出現
★ &代表最後匹配
★ 利用sed修改PATH環境變數
★ 測試並提高sed命令執行效率
★ 指定輸出檔案 [address1][,address2]w outputfile
★ 指定輸入檔案 [address]r inputfile
★ 替換相應字元 [address1][,address2]y/old/new/
★ !號的使用
★ \c正規表示式c 的使用
★ sed命令中正規表示式的複雜性
★ 轉換man手冊成普通文字格式(新)
★ sed的man手冊(用的就是上面的方法)
★ 命令列引數簡介
sed
-e script. 指定sed編輯命令
-f scriptfile 指定的檔案中是sed編輯命令
-n 寂靜模式,抑制來自sed命令執行過程中的冗餘輸出資訊,比如只
顯示那些被改變的行。
不 明白?不要緊,把這些骯髒丟到一邊,跟我往下走,不過下面的介紹裡
不包括正規表示式的解釋,如果你不明白,可能有點麻煩。
★ 首先假設我們有這樣一個文字檔案 sedtest.txt
cat > sedtest.txt
Sed is a stream editor
----------------------
A stream editor is used to perform. basic text transformations on an input stream
--------------------------------------------------------------------------------
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
sed works by making only one pass over the input(s), and is consequently more
-----------------------------------------------------------------------------
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
--------------------------------------------------------------------------------
-
★ 輸出指定範圍的行 p other types of editors.
sed -e "1,4p" -n sedtest.txt
sed -e "/from/p" -n sedtest.txt
sed -e "1,/from/p" -n sedtest.txt
★ 在每一行前面增加一個製表符(^I)
sed "s/^/^I/g" sedtest.txt
注意^I的輸入方法是ctrl-v ctrl-i
單個^表示行首
★ 在每一行後面增加--end
sed "s/$/--end/g" sedtest.txt
單個$表示行尾
★ 顯示指定模式匹配行的行號 [/pattern/]=
sed -e '/is/=' sedtest.txt
1
Sed is a stream editor
----------------------
3
A stream editor is used to perform. basic text transformations on an input stream
--------------------------------------------------------------------------------
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
7
sed works by making only one pass over the input(s), and is consequently more
-----------------------------------------------------------------------------
9
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
--------------------------------------------------------------------------------
-
-
意思是分析sedtest.txt,顯示那些包含is串的匹配行的行號,注意11行中出現了is字串
這個 輸出是面向stdout的,如果不做重定向處理,則不影響原來的sedtest.txt
★ 在匹配行後面增加文字 [/pattern/]a\ 或者 [address]a\
^D
sed -f sedadd.script. sedtest.txt
Sed is a stream editor
A stream editor is used to perform. basic text transformations on an input stream
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
sed works by making only one pass over the input(s), and is consequently more
-----------------------------------------------------------------------------
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
--------------------------------------------------------------------------------
-
-
[scz@ /home/scz/src]> sed -e "a\\
+++++++++
---------------------------------------------
找到包含from字串的行,在該行的下一行增加+++++++++。
這個輸出是面向stdout的,如果不做重定向處理, 則不影響原來的sedtest.txt
很多人想在命令列上直接完成這個操作而不是多一個sedadd.script,不幸的是,這需要 用?nbsp;
?nbsp;
續行符\,
[scz@ /home/scz/src]> sed -e "/from/a\\
> +++++++++" sedtest.txt
[scz@ /home/scz/src]> sed -e "a\\
> +++++++++" sedtest.txt
上面這條命令將在所有行後增加一個新 行+++++++++
[scz@ /home/scz/src]> sed -e "1 a\\
> +++++++++" sedtest.txt
把下面這兩行copy/paste到一個shell命令列上,效果一樣
+++++++++" sedtest.txt
[address]a\ 只接受一個地址指定
對於a命令,不支援單引號,只能用雙引號,而 對於d命令等其他命令,同時
★ 刪除匹配行 [/pattern/]d 或者 [address1][,address2]d
sed -e '/---------------------------------------------/d' sedtest.txt
Sed is a stream editor
A stream editor is used to perform. basic text transformations on an input stream
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
sed works by making only one pass over the input(s), and is consequently more
efficient. But it is sed's ability to filter text in a pipeline which particular
l
y
sed -e '6,10d' sedtest.txt
刪除6-10行的內容,包括6和10
sed -e "2d" sedtest.txt
刪除第2行的內容
sed "1,/^$/d" sedtest.txt
刪除從第一行到第一 個空行之間的所有內容
注意這個命令很容易帶來意外的結果,當sedtest.txt中從第一行開始並沒有空行,則sed刪
?nbsp;
?nbsp;
sed "1,/from/d" sedtest.txt
刪除從第一行到第一個包含from字串的 行之間的所有內容,包括第一個包含
from字串的行。
★ 替換匹配行 [/pattern/]c\ 或者 [address1][,address2]c\
sed -e "/is/c\\
**********" sedtest.txt
尋找所有包含is字串的匹配行,替換成**********
**********
----------------------
**********
--------------------------------------------------------------------------------
While in some ways similar to an editor which permits scripted edits (such as ed
)
,
--------------------------------------------------------------------------------
-
-
**********
-----------------------------------------------------------------------------
**********
--------------------------------------------------------------------------------
-
sed -e "1,11c\\
**********" sedtest.txt----------------------
在1-12行內搜尋所有from字串,分別替換成****字串
★ 限定範圍後的模式匹配
sed "/But/s/is/are/g" sedtest.txt
對那些包含But字串的行, 把is替換成are
sed "/is/s/t/T/" sedtest.txt
對那些包含is字串的行,把每行第一個出現 的t替換成T
sed "/While/,/from/p" sedtest.txt -n
輸出在這兩個模式匹配行之間的所有 內容
★ 指定替換每一行中匹配的第幾次出現
sed "s/is/are/5" sedtest.txt
把 每行的is字串的第5次出現替換成are
★ &代表最後匹配
sed "s/^$/(&)/" sedtest.txt
給所有空行增加一對()
sed "s/is/(&)/g" sedtest.txt
給 所有is字串外增加()
sed "s/.*/(&)/" sedtest.txt
給所有行增加一對()
sed "/is/s/.*/(&)/" sedtest.txt
給所有包含is字串的行增加一對()
★ 利用sed修改PATH環境變數
先檢視PATH環境變數
[scz@ /home/scz/src]> echo $PATH
/usr/bin:/usr/bin:/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/X11R6/bin:.
去掉尾部的{ :/usr/X11R6/bin:. }
[scz@ /home/scz/src]> echo $PATH | sed "s/^\(.*\):\/usr[/]X11R6\/bin:[.]$/\1/"
/usr/bin:/usr/bin:/bin:/usr/local/bin:/sbin:/usr/sbin
去掉中間的{ :/bin: }
[scz@ /home/scz/src]> echo $PATH | sed "s/^\(.*\):\/bin:\(.*\)$/\1\2/"
/usr/bin:/usr/bin/usr/local/bin:/sbin:/usr/sbin:/usr/X11R6/bin:.
[/]表示/失去特殊意義
\/同樣表示/失去意義
\1表示子匹配的第一次出現
\2表示子匹配的第二次出 現
\(.*\)表示子匹配
去掉尾部的:,然後增加新的路徑
PATH=`echo $PATH | sed 's/\(.*\):$/\1/'`:$HOME/src
注意反引號`和單引號'的區別。
★ 測試並提高sed命令執行效率
time sed -n "1,12p" webkeeper.db > /dev/null
time sed 12q webkeeper.db > /dev/null
可以看出後者比前者效率高。
[address]q 當碰上指定行時退出sed執行
★ 指定輸出檔案 [address1][,address2]w outputfile
sed "1,10w sed.out" sedtest.txt -n
將sedtest.txt中1-10行的內容寫到sed.out檔案中。
★ 指定輸入檔案 [address]r inputfile
sed "1r sedappend.txt" sedtest.txt
將 sedappend.txt中的內容附加到sedtest.txt檔案的第一行之後
★ 替換相應字元 [address1][,address2]y/old/new/
sed "y/abcdef/ABCDEF/" sedtest.txt
將sedtest.txt中所有的abcdef小寫字母替換成ABCDEF大寫字母。
★ !號的使用
sed -e '3,7!d' sedtest.txt
刪除3-7行之外的所有行
sed -e '1,/from/!d' sedtest.txt
找到包含from字串的行,刪除其後的所有行
★ \c正規表示式c 的使用
sed -e "\:from:d" sedtest.txt
等價於 sed -e "/from/d" sedtest.txt
★ sed命令中正規表示式的複雜性
cat > sedtest.txt
^\/[}]{.*}[\(]$\)
^D
如何才能把該行替換成
\(]$\)\/[}]{.*}^[
★ 轉換man手冊成普通文字格式(新)
man sed | col -b > sed.txt
sed -e "s/^H//g" -e "/^$/d" -e "s/^^I/ /g" -e "s/^I/ /g" sed.txt > sedman
.
txt
刪除所有退格鍵、空行,把行首的製表符替換成8個空格,其餘製表符替換成一個空格。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-733475/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- linux下的文字處理命令sedLinux
- 幾個常用的文字處理shell 命令:find、grep、sort、uniq、sed、awk
- Linux文字處理命令sed基本使用示例Linux
- Linux:管道命令與文字處理三劍客(grep、sed、awk)Linux
- 文字處理流編輯器sed命令用法大全
- Linux中文字處理命令sed的使用示例分享Linux
- [shell基礎]——sed命令
- Linux Shell程式設計(23)——文字處理命令Linux程式設計
- shell 中 grep、sed、awk 命令
- 10 文字分析處理命令
- Linux文字處理命令Linux
- 【shell筆記>命令】grep,sed,awk筆記
- Shell字元操作命令——grep、sed、awk字元
- 文字處理的金剛鑽 —— sed (GNU/sed)
- 批處理命令之tree命令
- Shell命令列命令列
- Linux文字處理命令(轉)Linux
- shell讀取配置檔案-sed命令
- linux之 sed命令Linux
- Linux命令之grep/sed/awk等行轉列Linux
- mac 命令列批量處理照片Mac命令列
- 詳解Bash命令列處理命令列
- Linux學習之檔案處理命令(二)目錄處理命令 && 檔案處理命令Linux
- 收集整理比較全 shell sed 命令與例項教程
- 程式設計小技巧之 Linux 文字處理命令(二)程式設計Linux
- Linux基礎命令---文字編輯sedLinux
- 使用 getopt() 進行命令列處理命令列
- 詳解Bash命令列處理(轉)命令列
- 【Mongo】shell命令列模式執行mongo命令Go命令列模式
- 幾個與文字處理相關的Linux命令總結Linux
- Linux命令篇 - sed 命令Linux
- 『忘了再學』Shell基礎 — 30、sed命令的使用
- shell程式設計-sed命令詳解(超詳細)程式設計
- Linux學習之檔案處理命令(一) 目錄處理命令lsLinux
- rpm與yum,at與crontab,sed命令使用
- linux Shell 命令列-03-array Shell 陣列Linux命令列陣列
- LINUX學習(五)Linux文字處理命令Linux
- Linux中sed命令b選項遮蔽指定的處理區域Linux