菜鸟linux的sed,Linux sed命令菜鸟入门
本文首先以一個(gè)簡單的sed命令應(yīng)用示例,說明如何使用sed命令進(jìn)行文本處理,接著從sed命令的用法、工作原理、行地址模式以及sed命令支持的腳本命令詳細(xì)介紹sed命令的用法。
一個(gè)完整的sed命令使用簡單示例
現(xiàn)在有一個(gè)待處理文件test.txt,文件中包含一系列的位圖數(shù)據(jù)1和0,它們位于
和之間,需要將它們寫入一個(gè)單獨(dú)的文件,并使用.FG .FE替換著部分內(nèi)容。替換輸入文件中的 標(biāo)識(shí)為.LP并刪除其下的空行。最后,刪除輸入文件中的所有空行。處理文件內(nèi)容如下:cat test.txt
This?is?a?test?paragraph.
111111111111111101000000000000000000000000000000111111111111111111100000000
000000000000000000000000000000000001111111111111111111111111111111111111111
11111111111111111110000000000000000000
MOre?lines?of?text?to?be?found?after?the?figure.
These?lines?should?print.
sed腳本命令內(nèi)容及解釋如下:cat sedscr
//{
N?????????????????????#讀入下一行,因?yàn)橄乱恍袨榭招?
c\????????????????????#使用下面的內(nèi)容替換模式空間中的內(nèi)容,之所以使用N命令,也是想把下面的空行刪除
.LP
}
/
/,//{??????#匹配到行之間的內(nèi)容w?fig.test????????????????????????#將這部分中的當(dāng)前模式空間中的內(nèi)容寫入文件fig.test中,因?yàn)閟ed命令式按行讀取文件內(nèi)容的
/
/i\??????????????????#在行前插入下面的內(nèi)容.FG\
\
.FE
d?????????????????????????????????#刪除匹配的行,即刪除模式空間中的內(nèi)容,這樣模式空間中的這部分內(nèi)容不會(huì)被輸出
}
/^$/d?????????????????????#刪除所有空行
sed腳本執(zhí)行命令:sed -f sedscr test.txt
sed腳本執(zhí)行完成后輸出內(nèi)容如下:
.LP
This?is?a?test?paragraph.
.FG
.FE
.LP
MOre?lines?of?text?to?be?found?after?the?figure.
These?lines?should?print.
上面簡單演示了一個(gè)使用sed命令的實(shí)際例子,初學(xué)時(shí)看不懂沒有關(guān)系,只需知道大概是這么個(gè)流程,然后下面會(huì)詳細(xì)的解釋sed命令的用法。
sed命令用法
sed[選項(xiàng)]?{腳本 | 腳本文件}?[輸入文件],其中[?]表示可選,{}表示必須。
首先將3個(gè)經(jīng)常出現(xiàn)的選項(xiàng)解釋如下:
-n, --quiet, --silent? ? ? ?? ? ? ? ? ? ? ? ? ?取消自動(dòng)打印模式空間
-e 腳本, --expression=腳本? ? ? ? ? 添加“腳本”到程序的運(yùn)行列表
-f 腳本文件, --file=腳本文件? ? ? ? ?添加“腳本文件”到程序的運(yùn)行列表
上面出現(xiàn)了sed命令的三個(gè)最基本最常見的參數(shù)選項(xiàng),其意思如下表所示:
-n選項(xiàng)
抑制sed命令的默認(rèn)輸出
-e選項(xiàng)
后接單引號(hào)包含的命令腳本,僅應(yīng)用單個(gè)命令于輸入文件時(shí)適用
-f 選項(xiàng)
指定一個(gè)文件包含多個(gè)腳本命令
這幾個(gè)選項(xiàng)的使用模式大致如下:
sed -n -e 'cmd_script' input_file ? ? ? ? ? #注意,單引號(hào)擴(kuò)住腳本命令
sed -f script_file input_file ? ? ? ? ? ? ? ? ? ?#將腳本命令寫入一個(gè)單獨(dú)的文件
其實(shí),sed命令的選項(xiàng)并不是學(xué)習(xí)sed命令的主要內(nèi)容,主要內(nèi)容是對(duì)于sed命令腳本部分的學(xué)習(xí)。sed支持的腳本命令比較多,后面會(huì)詳細(xì)介紹該部分內(nèi)容,介紹sed支持的腳本命令之前,先介紹一下sed命令執(zhí)行的原理。
sed工作原理
下面以sed -f script_file input_file為例,其工作原理如下圖所示:
其中input_file表示處理文件,script_file表示腳本命令。
工作原理如下:
a) 首先將處理文件的第一行讀入模式空間。
b) 接著對(duì)模式空間中的這一行內(nèi)容執(zhí)行腳本命令中設(shè)置的命令,從上至下依次執(zhí)行腳本命令中設(shè)置的命令。
c) 腳本命令執(zhí)行完成后,輸出模式空間中的內(nèi)容。
d) 清空模式空間中得內(nèi)容,并讀入處理文件中得第二行內(nèi)容,并重復(fù)b) 和 c) 步驟的內(nèi)容,直至處理完文件中的所有內(nèi)容。
苦逼的碼農(nóng)可以查看圖片右上角的偽代碼,可能解釋得更加清晰一點(diǎn)。
下面先對(duì)幾個(gè)經(jīng)常出現(xiàn)的名詞進(jìn)行解釋:
模式空間
以上描述中出現(xiàn)了一個(gè)詞叫模式空間,下面對(duì)其進(jìn)行解釋。由于sed命令的執(zhí)行并不修改原始文件,也就是說輸入文件是什么,執(zhí)行完sed命令后,輸入文件沒有變化,這么說來,肯定不能在輸入文件的基礎(chǔ)上對(duì)其進(jìn)行編輯,所以需要一塊單獨(dú)的空間,用于轉(zhuǎn)存文件中得內(nèi)容,然后進(jìn)行處理并輸出。模式空間就是這么一塊轉(zhuǎn)存輸入文件內(nèi)容的空間,并且sed命令一次讀入輸入文件中得一行內(nèi)容到模式空間,使用sed命令支持的腳步執(zhí)行處理完模式空間中得內(nèi)容后,輸出處理完的結(jié)果并刪除模式空間中得內(nèi)容,準(zhǔn)備讀入下一行輸入文件中得內(nèi)容。
多行模式空間
如上所述,模式空間每次讀入輸入文件中的一行進(jìn)行處理,有時(shí)只讀入一行內(nèi)容到模式空間對(duì)輸入文件的處理能力很有限,比如它很難處理一個(gè)在一行末尾處開始,并在下一行開始處結(jié)束的短語。而多行模式空間就是為了解決這個(gè)問題而提出的,他允許將模式空間中的內(nèi)容從一行擴(kuò)展到多行。具體內(nèi)容在本文后面會(huì)有講解。
保持空間
模式空間是容納當(dāng)前輸入行的緩沖區(qū),而保持空間是預(yù)留的一部分緩沖區(qū),用于臨時(shí)存儲(chǔ)模式空間中的內(nèi)容。模式空間中的內(nèi)容可以復(fù)制到保持空間,保持空間中的內(nèi)容也可以復(fù)制回模式空間。具體內(nèi)容在本文后面會(huì)有講解。
sed命令的行地址模式
為什么需要行地址模式呢?因?yàn)椴⒉皇禽斎胛募械拿恳恍袃?nèi)容都需要被sed命令處理,sed命令當(dāng)然只處理它感興趣的部分,于是需要使用行地址模式對(duì)要處理的行進(jìn)行控制。
行地址是由斜杠、行號(hào)或者行尋址符號(hào)擴(kuò)住的正則表達(dá)式描述。sed命令可以指定 0 或者 1 或者 2 個(gè)地址,每個(gè)地址都是一個(gè)描述模式、行號(hào)或者行選址符號(hào)的正則表達(dá)式。
1. 如果沒有制定地址,表示命令將應(yīng)用于每一行。
2. 如果只有一個(gè)地址,表示命令將應(yīng)用于與這個(gè)地址匹配的所有行。
3. 如果指定了由逗號(hào)分隔的兩個(gè)地址,表示命令應(yīng)用于匹配第一個(gè)地址的第一性和它后面的行,直到匹配第二個(gè)地址的行(包含此行)。
4. 如果地址后面跟有感嘆號(hào),表示命令將應(yīng)用于不匹配該地址的所有行。
例:
a) [address]command
b) [line-address]command
c) address {
command1 ? ? #在command后面添加空格可能會(huì)產(chǎn)生意想不到的錯(cuò)誤,建議每個(gè)command都單獨(dú)一行
command2
command3
} ?#右大括號(hào)必須單獨(dú)位于一行
sed命令支持的腳本命令
sed命令所支持的腳本命令很多,常見的腳本命令有s、d、p、n、i、a、c、y等。其中還包括與多行模式空間相關(guān)的N、D、P命令(均大寫)。與保持空間相關(guān)的h、H、g、G、x命令。
1. s命令(替換)
語法:[address]s/pattern/replacement/flags
解釋:替換命令應(yīng)用于與address匹配的行(address的匹配見行地址模式一節(jié)),如果沒有指定address,就應(yīng)用于與pattern匹配的所有行。
flags標(biāo)注可能是以下幾種情況中得一種:
g: 對(duì)模式空間中所有出現(xiàn)匹配的情況均進(jìn)行替換。沒有指定g時(shí)表示僅對(duì)第1次出現(xiàn)匹配的情況進(jìn)行替換。
n: 1-512之間的一個(gè)數(shù)字,表示對(duì)當(dāng)前模式空間中第n次出現(xiàn)所匹配部分的內(nèi)容進(jìn)行替換,其余所匹配部分的內(nèi)容不變。
p: 打印模式空間中的內(nèi)容。
w file: 將模式空間中的內(nèi)容寫入file中。
換行符在計(jì)算機(jī)內(nèi)部只是一個(gè)字符,所有正則表達(dá)式可以使用"\n"來匹配換行符。
replacement部分,下列字符具有特殊含義:
&: ?用正則表達(dá)式匹配的內(nèi)容進(jìn)行替換。
\n: 匹配第n個(gè)子串,這個(gè)子串以前在pattern中使用"\("和"\)"指定。
\: ?轉(zhuǎn)義字符,如上所述的&字符,在replacement中出現(xiàn)是就需要使用轉(zhuǎn)義字符。
例:
s/UNIX/\\s-&\\s0/g腳本將 on the UNIX OS 替換為 on the \s-UNIX\s0 OS,其中UNIX為正則表達(dá)式匹配的內(nèi)容,替換replacement中的&字符。其中第一個(gè)"\"字符為轉(zhuǎn)義字符。
s!/usr/mail!/usr2/mail!g ? ?#定界符并不一定必須是"/",也可以選擇其他字符,如本例中使用"!"作為定界符。
有一個(gè)test.txt文件內(nèi)容為first:second,現(xiàn)在想要將first和second替換位置。可以使用如下命令實(shí)現(xiàn):
sed -e 's/\(.*\):\(.*\)/\2:\1/' test.txt ? ?#"\("、"\)"在pattern中指定了兩個(gè)子串,"\1"、"\2"表示匹配第1個(gè)和第2個(gè)子串。
2. d命令(刪除)
待續(xù)......
總結(jié)
以上是生活随笔為你收集整理的菜鸟linux的sed,Linux sed命令菜鸟入门的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 易语言取c盘文件夹中的文件被占用,win
- 下一篇: java设计模式之道文字版,Java W