命令列與Shell -> 文字處理命令之sed

ljm0211發表於2012-06-20
以 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個空格,其餘製表符替換成一個空格。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-733475/,如需轉載,請註明出處,否則將追究法律責任。

相關文章