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