linux shell的sed命令詳解
linux shell的sed命令詳解
linux shell命令下的sed命令其實(shí)就是一個(gè)功能強(qiáng)大的編輯器工具,下面由學(xué)習(xí)啦小編為大家整理了linux shell之sed命令的相關(guān)知識(shí),希望對(duì)大家有幫助!
linux shell之sed命令詳解
說(shuō)明:
sed是stream editor(流編輯器)的縮寫(xiě)。它能夠完美匹配正則表達(dá)式。sed和awk是文件編輯最重要的兩個(gè)命令了。尤其涉及到了很多正則表達(dá)式的問(wèn)題,筆者不敢也有點(diǎn)犯怵,試著寫(xiě)寫(xiě)。
linux shell之sed命令實(shí)例
1.替換文件中的字符串
$sed -i 's/text/replace/g' file
#如果不加g結(jié)尾,則替換每一行的第一個(gè)
#如果只是打印,去掉-i
2.忽略前N處匹配,從N+1出開(kāi)始替換
$sed -i 's/text/replace/2g' file
#在g前面加入數(shù)字N
3.移除空白符
$sed '/^$/d' file
4.標(biāo)記已匹配的內(nèi)容
$echo this is an example | sed 's:\w\+:/[&]:g'
[this] [is] [an] [example]
#冒號(hào)是定界符,只要合適,定界符可以是任意的
5.子串匹配
$echo this is digit 7 in a number | sed 's:digit \(0-9\): class="main">
linux shell的sed命令詳解
#輸出:this is 7 in a number
#學(xué)過(guò)正則表達(dá)式的人,都理解group的概念,()里的內(nèi)容是第一組,所以只打印了7
6.引用
$text=hello
$echo hello world | sed "s/$text/HELLO"
#輸出HELLO world
#可能有人注意用雙引號(hào),是因?yàn)閱我?hào)會(huì)把$text當(dāng)做一個(gè)字符串,而不是表達(dá)式。
7.刪除
$sed '2d' file #刪除第二行
$sed '2,$d' file #刪除2-最后一行
$sed '$d' file #刪除最后一行
解讀—help
用法: sed [選項(xiàng)]... {腳本(如果沒(méi)有其他腳本)} [輸入文件]...
-n, --quiet, --silent
取消自動(dòng)打印模式空間
-e 腳本, --expression=腳本
添加“腳本”到程序的運(yùn)行列表
-f 腳本文件, --file=腳本文件
添加“腳本文件”到程序的運(yùn)行列表
--follow-symlinks
直接修改文件時(shí)跟隨軟鏈接
-i[擴(kuò)展名], --in-place[=擴(kuò)展名]
直接修改文件(如果指定擴(kuò)展名就備份文件)
-l N, --line-length=N
指定“l”命令的換行期望長(zhǎng)度
--posix
關(guān)閉所有 GNU 擴(kuò)展
-r, --regexp-extended
在腳本中使用擴(kuò)展正則表達(dá)式
-s, --separate
將輸入文件視為各個(gè)獨(dú)立的文件而不是一個(gè)長(zhǎng)的連續(xù)輸入
-u, --unbuffered
從輸入文件讀取最少的數(shù)據(jù),更頻繁的刷新輸出
--help 打印幫助并退出
--version 輸出版本信息并退出
如果沒(méi)有 -e, --expression, -f 或 --file 選項(xiàng),那么第一個(gè)非選項(xiàng)參數(shù)被視為
sed腳本。其他非選項(xiàng)參數(shù)被視為輸入文件,如果沒(méi)有輸入文件,那么程序?qū)臉?biāo)準(zhǔn)
輸入讀取數(shù)據(jù)。
解讀:
對(duì)于這個(gè)幫助信息,確實(shí)信息量非常不足,不過(guò)sed確實(shí)過(guò)于復(fù)雜,所以嘗試分成幾次來(lái)詳解這個(gè)命令。
我再借用另一段幫助信息文檔
調(diào)用sed命令有兩種形式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
options
a\ 例如:sed "a\mm" file
在當(dāng)前行后面加入一行文本。
b lable
分支到腳本中帶有標(biāo)記的地方,如果分支不存在則分支到腳本的末尾。
c\
用新的文本改變本行的文本。
d
從模板塊(Pattern space)位置刪除行。
D
刪除模板塊的第一行。
i\
在當(dāng)前行上面插入文本。
h
拷貝模板塊的內(nèi)容到內(nèi)存中的緩沖區(qū)。
H
追加模板塊的內(nèi)容到內(nèi)存中的緩沖區(qū)
g
獲得內(nèi)存緩沖區(qū)的內(nèi)容,并替代當(dāng)前模板塊中的文本。
G
獲得內(nèi)存緩沖區(qū)的內(nèi)容,并追加到當(dāng)前模板塊文本的后面。
l
列表不能打印字符的清單。
n
讀取下一個(gè)輸入行,用下一個(gè)命令處理新的行而不是用第一個(gè)命令。
N
追加下一個(gè)輸入行到模板塊后面并在二者間嵌入一個(gè)新行,改變當(dāng)前行號(hào)碼。
p
打印模板塊的行。
P(大寫(xiě))
打印模板塊的第一行。
q
退出Sed。
r file
從file中讀行。
t label
if分支,從最后一行開(kāi)始,條件一旦滿足或者T,t命令,將導(dǎo)致分支到帶有標(biāo)號(hào)的命令處,或者到腳本的末尾。
T label
錯(cuò)誤分支,從最后一行開(kāi)始,一旦發(fā)生錯(cuò)誤或者T,t命令,將導(dǎo)致分支到帶有標(biāo)號(hào)的命令處,或者到腳本的末尾。
w file
寫(xiě)并追加模板塊到file末尾。
W file
寫(xiě)并追加模板塊的第一行到file末尾。
!
表示后面的命令對(duì)所有沒(méi)有被選定的行發(fā)生作用。
s/re/string
用string替換正則表達(dá)式re。
=
打印當(dāng)前行號(hào)碼。
#
把注釋擴(kuò)展到下一個(gè)換行符以前。
以下的是替換標(biāo)記
g表示行內(nèi)全面替換。
p表示打印行。
w表示把行寫(xiě)入一個(gè)文件。
x表示互換模板塊中的文本和緩沖區(qū)中的文本。
y表示把一個(gè)字符翻譯為另外的字符(但是不用于正則表達(dá)式)
區(qū)別加斜桿與不加
例如: a\ 表示在a\后面加入內(nèi)容,而d則在d前面加入表達(dá)式,1d表示刪除1行。