青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

為生存而奔跑

   :: 首頁 :: 聯系 :: 聚合  :: 管理
  271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

留言簿(5)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 331733
  • 排名 - 74

最新評論

閱讀排行榜

評論排行榜

sed 是很有用(但常被遺忘)的 UNIX 流編輯器。在以批處理方式編輯文件或以有效方式創建 shell 腳本來修改現有文件方面,它是十分理想的工具。本文是 前一篇介紹 sed 文章的續篇。

替換!

讓我們看一下 sed 最有用的命令之一,替換命令。使用該命令,可以將特定字符串或匹配的規則表達式用另一個字符串替換。下面是該命令最基本用法的示例:

 $ sed -e 's/foo/bar/' myfile.txt 

上面的命令將 myfile.txt 中每行第一次出現的 'foo'(如果有的話)用字符串 'bar' 替換,然后將該文件內容輸出到標準輸出。請注意,我說的是 每行第一次出現,盡管這通常不是您想要的。在進行字符串替換時,通常想執行全局替換。也就是說,要替換每行中的 所有出現,如下所示:

$ sed -e 's/foo/bar/g' myfile.txt 

在最后一個斜杠之后附加的 'g' 選項告訴 sed 執行全局替換。

關于 's///' 替換命令,還有其它幾件要了解的事。首先,它是一個命令,并且只是一個命令,在所有上例中都沒有指定地址。這意味著,'s///' 還可以與地址一起使用來控制要將命令應用到哪些行,如下所示:

 $ sed -e '1,10s/enchantment/entrapment/g' myfile2.txt 

上例將導致用短語 'entrapment' 替換所有出現的短語 'enchantment',但是只在第一到第十行(包括這兩行)上這樣做。

 $ sed -e '/^$/,/^END/s/hills/mountains/g' myfile3.txt 

該例將用 'mountains' 替換 'hills',但是,只從空行開始,到以三個字符 'END' 開始的行結束(包括這兩行)的文本塊上這樣做。

關 于 's///' 命令的另一個妙處是 '/' 分隔符有許多替換選項。如果正在執行字符串替換,并且規則表達式或替換字符串中有許多斜杠,則可以通過在 's' 之后指定一個不同的字符來更改分隔符。例如,下例將把所有出現的 /usr/local 替換成 /usr:

 $ sed -e 's:/usr/local:/usr:g' mylist.txt 

在該例中,使用冒號作為分隔符。如果需要在規則表達式中指定分隔符字符,可以在它前面加入反斜杠。





回頁首


規則表達式混亂

目前為止,我們只執行了簡單的字符串替換。雖然這很方便,但是我們還可以匹配規則表達式。例如,以下 sed 命令將匹配從 '<' 開始、到 '>' 結束、并且在其中包含任意數量字符的短語。下例將刪除該短語(用空字符串替換):

 $ sed -e 's/<.*>//g' myfile.html  

這是要從文件除去 HTML 標記的第一個很好的 sed 腳本嘗試,但是由于規則表達式的特有規則,它不會很好地工作。原因何在?當 sed 試圖在行中匹配規則表達式時,它要在行中查找 最長的匹配。在我的 前一篇 sed 文章中,這不成問題,因為我們使用的是 'd' 和 'p' 命令,這些命令總要刪除或打印整行。但是,在使用 's///' 命令時,確實有很大不同,因為規則表達式匹配的整個部分將被目標字符串替換,或者,在本例中,被刪除。這意味著,上例將把下行:

 <b>This</b> is what <b>I</b> meant.  

變成:

 meant.  

我們要的不是這個,而是:

 This is what I meant.  

幸 運的是,有一種簡便方法來糾正該問題。我們不輸入“'<' 字符后面跟有一些字符并以 '>' 字符結束”的規則表達式,而只需輸入一個“'<' 字符后面跟有任意數量非 '>' 字符并以 '>' 字符結束”的規則表達式。這將與最短、而不是最長的可能性匹配。新命令如下:

 $ sed -e 's/<[^>]*>//g' myfile.html 

在上例中,'[^>]' 指定“非 '>'”字符,其后的 '*' 完成該表達式以表示“零或多個非 '>' 字符”。對幾個 html 文件測試該命令,將它們管道輸出到 "more",然后仔細查看其結果。





回頁首


更多字符匹配

'[ ]' 規則表達式語法還有一些附加選項。要指定字符范圍,只要字符不在第一個或最后一個位置,就可以使用 '-',如下所示:

 '[a-x]*' 

這將匹配零或多個全部為 'a'、'b'、'c'...'v'、'w'、'x' 的字符。另外,可以使用 '[:space:]' 字符類來匹配空格。以下是可用字符類的相當完整的列表:

字符類 描述
[:alnum:] 字母數字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或制表鍵
[:cntrl:] 任何控制字符
[:digit:] 數字 [0-9]
[:graph:] 任何可視字符(無空格)
[:lower:] 小寫 [a-z]
[:print:] 非控制字符
[:punct:] 標點字符
[:space:] 空格
[:upper:] 大寫 [A-Z]
[:xdigit:] 十六進制數字 [0-9 a-f A-F]

盡可能使用字符類是很有利的,因為它們可以更好地適應非英語 locale(包括某些必需的重音字符等等).





回頁首


高級替換功能

我們已經看到如何執行簡單甚至有些復雜的直接替換,但是 sed 還可以做更多的事。實際上可以引用匹配規則表達式的部分或全部,并使用這些部分來構造替換字符串。作為示例,假設您正在回復一條消息。下例將在每一行前面加上短語 "ralph said: ":

 $ sed -e 's/.*/ralph said: &/' origmsg.txt 

輸出如下:

 ralph said: Hiya Jim, ralph said: ralph said: 
I sure like this sed stuff! ralph said:

該例的替換字符串中使用了 '&' 字符,該字符告訴 sed 插入整個匹配的規則表達式。因此,可以將與 '.*' 匹配的任何內容(行中的零或多個字符的最大組或整行)插入到替換字符串中的任何位置,甚至多次插入。這非常好,但 sed 甚至更強大。





回頁首


那些極好的帶反斜杠的圓括號

's///' 命令甚至比 '&' 更好,它允許我們在規則表達式中定義 區域,然后可以在替換字符串中引用這些特定區域。作為示例,假設有一個包含以下文本的文件:

 foo bar oni eeny meeny miny larry curly moe jimmy the weasel  

現在假設要編寫一個 sed 腳本,該腳本將把 "eeny meeny miny" 替換成 "Victor eeny-meeny Von miny" 等等。要這樣做,首先要編寫一個由空格分隔并與三個字符串匹配的規則表達式。

 '.* .* .*'  

現在,將在其中每個感興趣的區域兩邊插入帶反斜杠的圓括號來定義區域:

 '\(.*\) \(.*\) \(.*\)'  

除了要定義三個可在替換字符串中引用的邏輯區域以外,該規則表達式的工作原理將與第一個規則表達式相同。下面是最終腳本:

 $ sed -e 's/\(.*\) \(.*\) \(.*\)/Victor \1-\2 Von \3/' myfile.txt  

如您所見,通過輸入 '\x'(其中,x 是從 1 開始的區域號)來引用每個由圓括號定界的區域。輸入如下:

 Victor foo-bar Von oni Victor eeny-meeny Von miny Victor larry-curly Von moe Victor jimmy-the Von weasel  

隨著對 sed 越來越熟悉,您可以花最小力氣來進行相當強大的文本處理。您可能想如何使用熟悉的腳本語言來處理這種問題 -- 能用一行代碼輕易實現這樣的解決方案嗎?





回頁首


組合使用

在 開始創建更復雜的 sed 腳本時,需要有輸入多個命令的能力。有幾種方法這樣做。首先,可以在命令之間使用分號。例如,以下命令系列使用 '=' 命令和 'p' 命令,'=' 命令告訴 sed 打印行號,'p' 命令明確告訴 sed 打印該行(因為處于 '-n' 模式)。

 $ sed -n -e '=;p' myfile.txt  

無 論什么時候指定了兩個或更多命令,都按順序將每個命令應用到文件的每一行。在上例中,首先將 '=' 命令應用到第 1 行,然后應用 'p' 命令。接著,sed 繼續處理第 2 行,并重復該過程。雖然分號很方便,但是在某些場合下,它不能正常工作。另一種替換方法是使用兩個 -e 選項來指定兩個不同的命令:

 $ sed -n -e '=' -e 'p' myfile.txt  

然而,在使用更為復雜的附加和插入命令時,甚至多個 '-e' 選項也不能幫我們的忙。對于復雜的多行腳本,最好的方法是將命令放入一個單獨的文件中。然后,用 -f 選項引用該腳本文件:

 $ sed -n -f mycommands.sed myfile.txt 

這種方法雖然可能不太方便,但總是管用。





回頁首


一個地址的多個命令

有時,可能要指定應用到一個地址的多個命令。這在執行許多 's///' 以變換源文件中的字和語法時特別方便。要對一個地址執行多個命令,可在文件中輸入 sed 命令,然后使用 '{ }' 字符將這些命令分組,如下所示:

 1,20{ 	s/[Ll]inux/GNU\/Linux/g 	s/samba/Samba/g 	s/posix/POSIX/g }  

上例將把三個替換命令應用到第 1 行到第 20 行(包括這兩行)。還可以使用規則表達式地址或者二者的組合:

 1,/^END/{         s/[Ll]inux/GNU\/Linux/g         s/samba/Samba/g         s/posix/POSIX/g 	p } 

該例將把 '{ }' 之間的所有命令應用到從第 1 行開始,到以字母 "END" 開始的行結束(如果在源文件中沒發現 "END",則到文件結束)的所有行。





回頁首


附加、插入和更改行

既然在單獨的文件中編寫 sed 腳本,我們可以利用附加、插入和更改行命令。這些命令將在當前行之后插入一行,在當前行之前插入一行,或者替換模式空間中的當前行。它們也可以用來將多行插入到輸出。插入行命令用法如下:

i\ This line will be inserted before each line  

如果不為該命令指定地址,那么它將應用到每一行,并產生如下的輸出:

This line will be inserted before each line line 1 here 
This line will be inserted before each line line 2 here
This line will be inserted before each line line 3 here
This line will be inserted before each line line 4 here

如果要在當前行之前插入多行,可以通過在前一行之后附加一個反斜杠來添加附加行,如下所示:

 i\ insert this line\ and this one\ and this one\ and, uh, this one too.  

附加命令的用法與之類似,但是它將把一行或多行插入到模式空間中的當前行之后。其用法如下:

 a\ insert this line after each line.  Thanks! :)  

另一方面,“更改行”命令將實際 替換模式空間中的當前行,其用法如下:

 c\ You're history, original line! Muhahaha! 

因為附加、插入和更改行命令需要在多行輸入,所以將把它們輸入到一個文本 sed 腳本中,然后通過使用 '-f' 選項告訴 sed 執行它們。使用其它方法將命令傳遞給 sed 會出現問題。

posted on 2010-05-20 21:29 baby-fly 閱讀(157) 評論(0)  編輯 收藏 引用 所屬分類: Ubuntu&Linux
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线一区二区三区做爰视频网站| 亚洲人成在线免费观看| 先锋影音久久久| 亚洲欧美精品| 午夜精品福利在线| 亚洲国产精品一区在线观看不卡| 狠狠色狠狠色综合日日91app| 国产精品成人在线观看| 国产精品私拍pans大尺度在线 | 欧美风情在线| 欧美日韩视频| 国产一区二区三区免费不卡 | 国产一区二区三区在线观看视频| 国产日产欧产精品推荐色| 尤物九九久久国产精品的分类| 最新国产成人在线观看| 亚洲在线播放电影| 久久久综合网站| 亚洲看片免费| 久久精品视频免费播放| 欧美日韩免费| 狠狠色狠狠色综合日日五| 一本色道久久精品| 久久免费黄色| 日韩一级裸体免费视频| 久久久久久久一区二区三区| 欧美日韩精品国产| 有码中文亚洲精品| 亚洲欧美日韩一区在线| 亚洲高清自拍| 欧美一级免费视频| 欧美日韩高清在线播放| 亚洲电影在线看| 久久精品午夜| 亚洲一区999| 欧美激情一区| 亚洲国产另类精品专区| 久久久999精品| 亚洲午夜视频在线| 欧美日本中文字幕| 91久久午夜| 久久久久久999| 亚洲图片欧洲图片日韩av| 欧美激情在线播放| 亚洲第一精品夜夜躁人人爽| 久久激情网站| 午夜视频精品| 国产乱码精品一区二区三区忘忧草| 一本大道av伊人久久综合| 欧美高潮视频| 美女黄色成人网| 亚洲国产精品视频| 欧美14一18处毛片| 久久婷婷蜜乳一本欲蜜臀| 国产一区二区三区久久久久久久久| 欧美在线播放| 欧美在线高清| 国产综合色在线视频区| 久久久久久夜| 另类天堂av| 日韩午夜av电影| 国产精品美女久久久免费| 欧美性一二三区| 国内精品模特av私拍在线观看| 亚洲在线成人| 亚洲午夜av在线| 国产美女一区二区| 久久九九久精品国产免费直播| 性欧美暴力猛交另类hd| 国产在线一区二区三区四区 | 欧美区亚洲区| 亚洲天堂网在线观看| 在线亚洲欧美| 国产日韩欧美高清免费| 巨胸喷奶水www久久久免费动漫| 久久九九国产| 亚洲精品少妇网址| 亚洲视频一起| 狠狠入ady亚洲精品| 欧美激情一区三区| 国产精品对白刺激久久久| 久久激情婷婷| 欧美国产精品v| 性欧美暴力猛交另类hd| 久久久久免费视频| 一区二区高清视频在线观看| 亚洲综合社区| 亚洲人成高清| 亚洲欧美日韩精品一区二区| 精品动漫一区二区| 亚洲精品美女91| 国产女人18毛片水18精品| 免费观看成人www动漫视频| 欧美日韩国产精品| 久久亚洲春色中文字幕| 欧美精品九九| 老司机午夜精品视频在线观看| 欧美精品一区二区三| 欧美在线黄色| 欧美久久婷婷综合色| 久久久九九九九| 欧美日本一区二区高清播放视频| 久久久亚洲精品一区二区三区 | 欧美视频专区一二在线观看| 另类天堂av| 国产乱肥老妇国产一区二| 亚洲国产成人高清精品| 国产日韩一区二区三区在线| 亚洲激情成人| 极品日韩av| 午夜精品在线观看| 亚洲一区二区三区激情| 欧美成年人视频网站| 久久女同互慰一区二区三区| 欧美三日本三级少妇三2023| 亚洲第一中文字幕| 玉米视频成人免费看| 先锋影音国产精品| 性欧美暴力猛交另类hd| 欧美三级电影网| 亚洲激情在线激情| 亚洲国产成人av| 久久久久久尹人网香蕉| 在线观看亚洲精品| 亚洲一区二区av电影| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲国产另类精品专区| 欧美一区二区三区免费看| 亚洲——在线| 欧美小视频在线观看| 日韩午夜中文字幕| 99热这里只有精品8| 欧美jizz19hd性欧美| 欧美国产亚洲视频| 亚洲国产91色在线| 欧美成人午夜剧场免费观看| 免费观看在线综合| 亚洲国产天堂久久综合| 久久综合九色欧美综合狠狠| 老色鬼精品视频在线观看播放| 国产在线高清精品| 久久久噜噜噜久久中文字幕色伊伊 | 9久re热视频在线精品| 99视频一区二区| 欧美日韩精品一区二区在线播放 | 国产伦精品一区| 亚洲欧美日韩视频一区| 欧美在线一级va免费观看| 国产喷白浆一区二区三区| 性久久久久久| 免费不卡亚洲欧美| 亚洲欧洲在线播放| 国产精品99免视看9| 午夜精品久久久久久久久久久久久 | 久久综合网色—综合色88| 精品88久久久久88久久久| 久久久青草青青国产亚洲免观| 亚洲成色精品| 制服丝袜激情欧洲亚洲| 国产精品女人毛片| 久久国产天堂福利天堂| 亚洲成人自拍视频| 午夜激情亚洲| 亚洲缚视频在线观看| 欧美日韩国产一区二区三区| 亚洲伊人伊色伊影伊综合网| 麻豆乱码国产一区二区三区| 99精品视频免费观看| 国产精品一区二区三区乱码| 久久久久久久尹人综合网亚洲| 亚洲精品欧美| 久久午夜羞羞影院免费观看| 亚洲久久一区二区| 久久精品国产一区二区电影| 欧美福利一区| 午夜激情亚洲| 亚洲区第一页| 国产一区二区精品| 欧美日韩日本网| 久久一区二区三区四区| 中文精品99久久国产香蕉| 美女国产一区| 欧美一区高清| 一区二区三区国产精品| 红杏aⅴ成人免费视频| 欧美色视频一区| 免费看的黄色欧美网站| 午夜日韩在线观看| 99视频一区二区| 欧美国产日韩视频| 久久久久久久久久看片| 亚洲一区国产视频| 日韩一二三区视频| 在线欧美小视频| 国产亚洲欧美日韩一区二区| 欧美亚一区二区| 欧美精品观看| 欧美3dxxxxhd| 欧美v国产在线一区二区三区| 久久精品国产综合精品|