1. 程式人生 > >第9章 文本處理工具sed

第9章 文本處理工具sed

sed 文本 linux

筆記整理開始時間:2018年4月17日08:45:48

更多內容請點擊:

Linux學習從入門到打死也不放棄,完全筆記整理(持續更新,求收藏,求點贊~~~~)

http://blog.51cto.com/13683480/2095439


第9章 文本處理工具sed

本章內容

sed介紹

sed用法

sed高級用法

文本處理工具sed

Stream EDitor,行編輯器

又稱流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時

緩沖區,稱為"模式空間"(pattern space),接著用sed命令處理緩沖區中

的內容,處理完成後,把緩沖區的內容送往屏幕。然後讀入下一行,執行下

一個循環。

如果沒有使用諸如“D”的特殊命令,那會在兩個循環之間清空模式空間,但不

會清空保留空間。這樣不斷重復,直到文件末尾。文件內容並沒有改變,除非

你使用重定向存儲輸出。

功能:

主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等

參考:http://www.gnu.org/software/sed/manual/sed.html

sed用法:

sed [option]..'script' inputfile..

常用選項:

-n 不輸出模式空間內容到屏幕,即不自動打印

-e 多點編輯

-f /path/scipt_file 從指定 文件中讀取編輯腳本

-r 使用擴展的正則表達式

-i.bak: 備份文件並原處編輯

scrip:

'地址命令' 地址+命令

地址定界:

不給地址:對全文進行處理

單地址:

#:指定的行,

$:最後一行

/pattern/: 被此處模式所能夠匹配到的每一行

地址範圍:

#,# 第#行到第#行到第#行

#,+@ 第#行到第#+@行

/pat1/,/par2/ 匹配part1的行到匹配part2的行

#,/part/ 第#行到匹配part的行

~:步進

1~2 奇數行

2~2 偶數行

編輯命令:

d 刪除模式空間匹配的行,並立即啟用下一輪循環

p 打印當前模式空間內容,追加到默認輸出之後

a[\]text: 在指定行後面追加文本

支持使用\n實現多行追加

i[\]text: 在指定行前面插入文本

c[\]text: 替換行尾單行或多行文本

w /path/somefile: 保存模式匹配的行至指定文件

r /path/somefile: 讀取指定文件的文本至模式空間中

匹配到的行後

=: 為模式空間中的行打印行號

查找替換:

s///: 查找替換,支持使用其他分隔符,s@@@,s###

替換標記:

g:行內全局替換

p:顯示替換成功的行

w /pash/to/somefile: 將替換成功的行保存至文件中

-n pgw file 全局替換且打印匹配行 並保存匹配行至文件

sed 示例:

sed '2p' /etc/passwd

sed -n '2p' /etc/passwd

sed -n '1,4p' /etc/passwd

sed -n '2,/root/p' /etc/passwd

sed -n -e '/^$/p' -e '/^$/=' file sed -n '/^$/p;/^$/=' file

sed '/root/a\hello' /etc/passwd

sed '/root/i\hello' /etc/passwd

sed '/root/c\hello' /etc/passwd

sed '/^$/d' file 刪除空行

sed '/1,10d' file

nl /etc/passwd |sed '2,5d' nl = cat -b 非空行編號

nl /etc/passwd |sed '2a tea' 行後插入tea

sed 's/test/mytest/g' file 全文查找替換

sed -n 's/root/&superman&/p' /etc/passwd 添加替換 &引用原文

sed -e 's/dog/cat/' -e 's/hi/lo/' pets

sed -i.bak 's/dog/cat/g' pets

高級編輯命令:

P 打印模式空間開端至\n內容,並追加到默認輸出之前

h 把模式空間中的內容覆蓋至保持空間中

H 把模式空間中的內容追加至保持空間中

g 從保持空間取出數據覆蓋至模式空間

G 從保持空間取出內容追加至模式空間

x 把模式空間中的內容與保持空間中的內容進行替換

n 讀取匹配到的行的下一行覆蓋至模式空間

N 讀取匹配到的行的下一行追加至模式空間

d 刪除模式空間中的行

D 如果模式空間中包含換行符,則刪除知道第一個換行符的模式空間中的文本,

並不會讀取新的輸入行,而使用合成的模式空間重新啟動循環。如果模式空間

不包含換行符,則會像發出d命令那樣啟動正常的新循環

H h為存 G g 為取 如沒有存,則取為空行

示例:

sed -n 'n;p'file 打印偶數行

sed '1!G;h;$!d' 漢諾塔 倒序顯示 相當於 tac

sed 'N;D' file 只顯示了最後一行相當於 sed -n '$p' f1

sed '$!N;$!D' file 顯示了最後兩行

sed '$!d' file 顯示了最後一行

sed 'G' file 每一行後都加上空行

sed '/part/g' file 指定行替換為空行

sed '/^$/d;G' file 刪除空行之後每一行之後都加空行

sed 'n;d' file 刪除偶數行(只顯示奇數行)

sed 'n;n;d' file 刪除3的倍數行,從第3行開始

sed '1~3d' file 從第1行開始,隔2行刪除1行

顯示奇數行

seq 10 | sed '2~2d'

seq 10 | sed -n '1~2p'

seq 10 | sed 'n;d'

顯示偶數行

seq 10 | sed '1~2d'

seq 10 | sed -n '2~2p'

seq 10 | sed -n 'n;p'

練習:

1,刪除centos7系統/etc/grub2.cfg 文件中所有以空白開頭的行行首的空白

字符

cat /etc/grub2.cfg | sed -r 's/^[[:space:]]+(.*)$/\1/'

2. 刪除/etc/fstab 文件中所有以#開頭,後面至少跟一個空白字符的行的行首

的#和空白字符

cat /etc/fatab |sed -r 's/^#[[:space:]]+(.*)$/\1/'

3. 在centos6系統/root/install.log每一行行首增加#號

cat /root/install.log | sed -r 's/.*/#&/'

4. 在/etc/fstab 文件中不以#開頭的行的行首增加#號

cat /etc/fstab |sed -r 's/^[^#].*/#&/'

5. 處理/etc/fstab路徑,使用sed命令取出其目錄名和基名

basename:

echo /etc/fstab |sed -r 's#.*/([^/]+/?)#\1#'

dirname

echo /etc/fstab |sed -r 's#^(.*/)\<.*#\1#'

6. 利用sed 取出ifconfig命令中本機的ipv4地址

ifconfig |sed -n -r '2s/.*inet\ (.*)\ netmask.*/\1/p'

7. 統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個

字段的重復次數

ls |sed -r 's/.*\.([^.]+)\.rpm/\1/' |sort|uniq -c|sort -nr

8.統計/etc/init.d/functions文件中每個單詞的出現次數,並排序(用grep

和sed兩種方法分別實現)

sed方式:

cat /etc/init.d/functions|sed -r 's/[^[:alpha:]]/\n/g'|sed -r '/^$/d'|sed -r '/^.$/d'|sort|uniq -c|sort -nr

總單詞數:1747 (一個字母不算單詞)

cat /etc/init.d/functions|sed -r 's/[^[:alpha:]]/\n/g'|sed -r '/^$/d'|sed -r '/^[^ai]$/d'|sort|uniq -c |sort -n

總單詞數:1774 除開a i 之外單字母不算單詞

cat /etc/init.d/functions|sed -r 's/[^[:alpha:]]/\n/g'|sed -r '/^$/d'|sort|uniq -c |sort -n

總單詞數:1994 單個字母也算單詞

grep方式:

cat /etc/init.d/functions|grep -Eoi '[[:alpha:]]+'|sort|uniq -c|sort -n

總單詞數:1994

9.將文本文件的n和n+1行合並為1行,n為奇數行

sed -n 'N;s/\n/ /' f1

cat f1 |xargs -n2

筆記整理完成時間:2018年4月20日14:06:12


第9章 文本處理工具sed