国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

第13章 使用sed處理文本

2019-11-08 18:21:52
字體:
來源:轉載
供稿:網友

sed適合文件修改比較大的情況,vim或gedit適合小處修改。

sed命令支持的三種操作,即打印、刪除和替換

1.     sed如何工作

sed是一個流編輯器,它可以對從標準輸入流中得到的數據進行處理,然后把處理以后得到的結果輸出到標準輸出,而標準輸出通常會關聯到終端屏幕,因此處理后的結果也會顯示到屏幕上。當然,也可以把標準輸出重定向到文件,這樣處理后的結果就保存在磁盤文件中。注意,sed只會對流經它的數據流進行處理和編輯,而不會對原始文件做任何修改,這就意味著要處理的數據并不一定非要是磁盤上的文件,也可以是其他進程的數據輸出。

 

案例1:將HTML頁面中的email地址從jerry@zulmma.com改為emma@zulmma.com

 index.html內容:

Email me! 

Page created by:jerry@zulmma.com

copyright @2012 mysite!

modify_webpage.sh的內容如下:

#!/bin/bash#處理命令行的每一個文件,可以使用通配符for file in "$@"do      echo "**PRocessing $file**"  #保存結果到臨時文件中 sed 's/jerry@zulmma.com/emma@zulmma.com/g' "$file" > "$file.$$"  if [ -f $file.$$ ] then       #覆蓋原始文件mv -f "$file.$$" "$file" fidone echo " All Done."exit 0

 

sed命令通常有兩種調用形式:

#sed程序從管道中讀取輸入數據

$some_command | sed ‘edit commands’

 

#sed程序使用命令行參數讀取文件內容,而不是從標準輸入中讀取

$sed ‘edit commands’ files

 

案例2:使用sed編輯多個命令,有以下兩個方法:

l  使用分號連接多個編輯命令

sed ‘s/command1/command2/g;s/command3/command4/g’ files

l  使用選項-e指定多個編輯命令

sed –e ‘s/command1/command2/g’ –e ‘s/command3/command4/g’files

 

案例3:修飾符I或i大小寫不敏感匹配

$sed ‘s/command1/command2/gi’ files

除了這兩個修飾符以外,替換命令還接收如下修飾符:

修飾符

含義

num

只取代第num個匹配

p

如果匹配成功,打印模式空間

w FILENAME

如果匹配成功,把結果寫到文件FILENAME中

g

全局匹配,而不是只替換第一個匹配

I or i

用大小寫不敏感的匹配

 

案例4:若干替換命令的字符中含有分隔符,需要給它轉義。

 

2.     選擇要操作的行

若只想要操作的行,有兩種方法:

l  正則表達式匹配的行

l  地址指定sed命令要操作的行

所謂地址就是文本文件的行號,要么是一個文件中的特定行,要么是一個范圍。如果在編輯命令中沒有指定地址,則sed命令會對每一行都執行編輯操作。

 

案例1:刪除或打印某一行或某范圍的所有行

#從文件中刪除一行

$cat –n /etc/passwd | sed ‘11d’ | more

#從文件中刪除一個范圍的行數據

$cat –n /etc/passwd | sed ‘3,26d’

#打印文件某行

$cat –n /etc/passwd | sed –n ‘11p’

打印文件某些行

$cat –n /etc/passwd |sed –n ‘3,26p’

#打印第3行及后面的3行數據

$cat –n /etc/passwd | sed –n ‘3,+3p’

解析:cat –n作用是在每行前面添加行號;編輯命令d是表示行;sed命令的默認行為是輸出所有的行數據,選項-n關閉這個默認行為;編輯命令p是明確告訴sed命令打印某些行;+num表示從起始行開始,后面的多少行在這個范圍內。

 

案例2:打印文件/etc/passwd中范圍之外的行

#使用感嘆號!對地址范圍取反

$cat –n /etc/passwd | sed –n ‘3,26!p’

解析:感嘆號!可以對某行或某范圍取反;

 

案例3:打印出/etc/passwd文件中所有單數行數據

#打印每一個奇數行

$cat –n /etc/passwd | sed –n ‘1~2p’

解析:使用address stepping的尋址方式。’1~2p’,1是起始地址,2p表示從上一次操作的行增加2行;

 

案例4:希望刪除配置文件/etc/sysctl.conf中的所有注釋行

#刪除文件/etc/sysctl.conf中的所有注釋行

$cat /etc/sysctl.conf | sed ‘/^#/d’

 

案例5:打印/etc/sysctl.conf文件中以數字結尾的行

#找到所有以數字結尾的行

$cat /etc/sysctl.conf | sed –n ‘/[0-9]$/p’

 

正則表達式可以指定字符的范圍:

集合

含義

[a-z]

匹配一個小寫字母

[A-Z]

匹配一個大寫字母

[a- zA-Z]

匹配一個字母

[a- zA-Z0-9]

匹配一個字母或數字

 

案例6:希望打印/etc/sysctl.conf文件中從’# Do not accept ICMP’開始,到’# Log Martian Packets’之間的內容

#使用正則表達式匹配確定要匹配的行范圍

$cat /etc/sysctl.conf | sed –n ’/^# Do notaccept ICMP/,/^# Log Martian Packets/p’

#還可以將行號與正則表達式混合使用

$cat /etc/sysctl.conf | sed –n ’17,/^# LogMartian Packets/p’

3.     重用匹配到的字符串

在sed命令中,正則表達式除了可以確定操作的行以外,還可以在替換命令中匹配希望被替換的字符串。

 

案例1:

#使用正則表達式所有的空行替換字符#

$cat /etc/sysctl.conf | sed ‘s/^$/#/’

 

案例2:

#在/etc/sysctl.conf文件中的所有非注釋行前都添加一個#字符進行注釋

$cat /etc/sysctl.conf | sed ‘s/^[^#].*$/#&/’

4.     小結

剛開始你可能會認為學習sed命令的使用會浪費很多時間,但是當你花費了一些時間真正掌握了它以后,你會發現這些時間和努力是非常值得的。sed命令是一個強大的流編輯器,它可以為我們自動執行大量枯燥繁瑣的編輯操作。執行sed命令時有一個模式空間的概念,本質上它就是一個工作緩存,sed命令每處理一行數據都會先把數據讀入這個緩存中,然后再按照順序執行所指定的編輯命令來處理這些數據。

本章的重要知識點包括:

(1)sed命令的工作原理;

(2)如何避免sed命令默認打印模式緩存;

(3)什么是正則表達式;

(4)如何使用正則表達式匹配行的開頭和結尾,如何匹配一個字符和任意個字符;

(5)如何使用sed命令替換字符串;

(6)選擇要操作行的幾種方式;

(7)如何在替換命令中使用正則表達式匹配要替換的字符串;

(8)如何在替換命令中引用正則表達式匹配到的結果。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 梁平县| 安泽县| 运城市| 福海县| 大庆市| 抚顺县| 富宁县| 平南县| 鄱阳县| 双柏县| 边坝县| 香河县| 陈巴尔虎旗| 平南县| 永嘉县| 长兴县| 文昌市| 无棣县| 陵川县| 沙坪坝区| 界首市| 三穗县| 蛟河市| 修文县| 斗六市| 永川市| 华坪县| 临猗县| 饶阳县| 叶城县| 山阳县| 水富县| 利辛县| 沽源县| 浪卡子县| 鄱阳县| 平潭县| 尉氏县| 中山市| 化德县| 民乐县|