




免費(fèi)預(yù)覽已結(jié)束,剩余1頁可下載查看
下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
sed替換用法替換!讓我們看一下sed最有用的命令之一,替換命令。使用該命令,可以將特定字符串或匹配的規(guī)則表達(dá)式用另一個(gè)字符串替換。下面是該命令最基本用法的示例:CODE:$ sed -e s/foo/bar/ myfile.txt 上面的命令將 myfile.txt 中每行第一次出現(xiàn)的 foo(如果有的話)用字符串 bar 替換,然后將該文件內(nèi)容輸出到標(biāo)準(zhǔn)輸出。請(qǐng)注意,我說的是每行第一次出現(xiàn),盡管這通常不是您想要的。在進(jìn)行字符串替換時(shí),通常想執(zhí)行全局替換。也就是說,要替換每行中的所有出現(xiàn),如下所示:CODE:$ sed -e s/foo/bar/g myfile.txt 在最后一個(gè)斜杠之后附加的 g 選項(xiàng)告訴 sed 執(zhí)行全局替換。關(guān)于 s/ 替換命令,還有其它幾件要了解的事。首先,它是一個(gè)命令,并且只是一個(gè)命令,在所有上例中都沒有指定地址。這意味著,s/ 還可以與地址一起使用來控制要將命令應(yīng)用到哪些行,如下所示:CODE:$ sed -e 1,10s/enchantment/entrapment/g myfile2.txt 上例將導(dǎo)致用短語 entrapment 替換所有出現(xiàn)的短語 enchantment,但是只在第一到第十行(包括這兩行)上這樣做。CODE:$ sed -e /$/,/END/s/hills/mountains/g myfile3.txt 該例將用 mountains 替換 hills。但是,只從空行開始,到以三個(gè)字符 END 開始的行結(jié)束(包括這兩行)的文本塊上這樣做。關(guān)于 s/ 命令的另一個(gè)妙處是 / 分隔符有許多替換選項(xiàng)。如果正在執(zhí)行字符串替換,并且規(guī)則表達(dá)式或替換字符串中有許多斜杠,則可以通過在 s 之后指定一個(gè)不同的字符來更改分隔符。例如,下例將把所有出現(xiàn)的 /usr/local 替換成 /usr:CODE:$ sed -e s:/usr/local:/usr:g mylist.txt 在該例中,使用冒號(hào)作為分隔符。如果不指定分隔符,則變成了如下:CODE:$ sed -e s/usr/local/usrg mylist.txt 這樣就不能執(zhí)行了如果需要在規(guī)則表達(dá)式中指定分隔符字符,可以在它前面加入反斜杠。規(guī)則表達(dá)式混亂目前為止,我們只執(zhí)行了簡單的字符串替換。雖然這很方便,但是我們還可以匹配規(guī)則表達(dá)式。例如,以下 sed 命令將匹配從 結(jié)束、并且在其中包含任意數(shù)量字符的短語。下例將刪除該短語(用空字符串替換):CODE:$ sed -e s/g myfile.html 這是要從文件除去 HTML 標(biāo)記的第一個(gè)很好的 sed 腳本嘗試,但是由于規(guī)則表達(dá)式的特有規(guī)則,它不會(huì)很好地工作。原因何在?當(dāng) sed 試圖在行中匹配規(guī)則表達(dá)式時(shí),它要在行中查找最長的匹配。在我的前一篇 sed 文章中,這不成問題,因?yàn)槲覀兪褂玫氖?d 和 p 命令,這些命令總要?jiǎng)h除或打印整行。但是,在使用 s/ 命令時(shí),確實(shí)有很大不同,因?yàn)橐?guī)則表達(dá)式匹配的整個(gè)部分將被目標(biāo)字符串替換,或者,在本例中,被刪除。這意味著,上例將把下行:CODE:This is what I meant. 變成:meant. 我們要的不是這個(gè),而是:This is what I meant. 幸運(yùn)的是,有一種簡便方法來糾正該問題。我們不輸入“ 字符結(jié)束”的規(guī)則表達(dá)式,而只需輸入一個(gè)“ 字符,并以 字符結(jié)束”的規(guī)則表達(dá)式。這將與最短、而不是最長的可能性匹配。新命令如下:CODE:$ sed -e s/*/g myfile.html 在上例中, 指定“非 ”字符,其后的 * 完成該表達(dá)式以表示“零或多個(gè)非 字符”。對(duì)幾個(gè) html 文件測(cè)試該命令,將它們管道輸出 more,然后仔細(xì)查看其結(jié)果。更多字符匹配 規(guī)則表達(dá)式語法還有一些附加選項(xiàng)。要指定字符范圍,只要字符不在第一個(gè)或最后一個(gè)位置,就可以使用 -,如下所示:QUOTE:a-x* 這將匹配零或多個(gè)全部為 a、b、c.v、w、x 的字符。另外,可以使用 字符類來匹配空格。以下是可用字符類的相當(dāng)完整的列表:字符類 描述 字母數(shù)字 a-z A-Z 0-9 字母 a-z A-Z 空格或制表鍵 任何控制字符 數(shù)字 0-9 任何可視字符(無空格) 小寫 a-z 非控制字符 標(biāo)點(diǎn)字符 空格 大寫 A-Z 十六進(jìn)制數(shù)字 0-9 a-f A-F 盡可能使用字符類是很有利的,因?yàn)樗鼈兛梢愿玫剡m應(yīng)非英語 locale(包括某些必需的重音字符等等).高級(jí)替換功能 已經(jīng)看到如何執(zhí)行簡單甚至有些復(fù)雜的直接替換,但是 sed 還可以做更多的事。實(shí)際上可以引用匹配規(guī)則表達(dá)式的部分或全部,并使用這些部分來構(gòu)造替換字符串。作為示例,假設(shè)您正在回復(fù)一條消息。下例將在每一行前面加上短語 ralph said: :CODE:$ sed -e s/.*/ralph said: &/ origmsg.txt 輸出如下:CODE:ralph said: Hiya Jim, ralph said: ralph said: I sure like this sed stuff! ralph said: 該例的替換字符串中使用了 & 字符,該字符告訴 sed 插入整個(gè)匹配的規(guī)則表達(dá)式。因此,可以將與 .* 匹配的任何內(nèi)容(行中的零或多個(gè)字符的最大組或整行)插入到替換字符串中的任何位置,甚至多次插入。這非常好,但 sed 甚至更強(qiáng)大。那些極好的帶反斜杠的圓括號(hào)s/ 命令甚至比 & 更好,它允許我們?cè)谝?guī)則表達(dá)式中定義區(qū)域,然后可以在替換字符串中引用這些特定區(qū)域。作為示例,假設(shè)有一個(gè)包含以下文本的文件:CODE:foo bar oni eeny meeny miny larry curly moe jimmy the weasel 現(xiàn)在假設(shè)要編寫一個(gè)sed 腳本,該腳本將把 eeny meeny miny 替換成 Victor eeny-meeny Von miny 等等。要這樣做,首先要編寫一個(gè)由空格分隔并與三個(gè)字符串匹配的規(guī)則表達(dá)式。CODE:.* .* .* 現(xiàn)在,將在其中每個(gè)感興趣的區(qū)域兩邊插入帶反斜杠的圓括號(hào)來定義區(qū)域:CODE:(.*) (.*) (.*) 除了要定義三個(gè)可在替換字符串中引用的邏輯區(qū)域以外,該規(guī)則表達(dá)式的工作原理將與第一個(gè)規(guī)則表達(dá)式相同。下面是最終腳本:CODE:$ sed -e s/(.*) (.*) (.*)/Victor 1-2 Von 3/ myfile.txt 如您所見,通過輸入 x(其中,x 是從 1 開始的區(qū)域號(hào))來引用每個(gè)由圓括號(hào)定界的區(qū)域。輸入如下:CODE:Victor foo-bar Von oni Victor eeny-meeny Von miny Victor larry-curly Von moe Victor jimmy-the Von weasel 隨著對(duì) sed 越來越熟悉,您可以花最小力氣來進(jìn)行相當(dāng)強(qiáng)大的文本處理。您可能想如何使用熟悉的腳本語言來處理這種問題 - 能用一行代碼輕易實(shí)現(xiàn)這樣的解決方案嗎?組合使用在開始創(chuàng)建更復(fù)雜的 sed 腳本時(shí),需要有輸入多個(gè)命令的能力。有幾種方法這樣做。首先,可以在命令之間使用分號(hào)。例如,以下命令系列使用 = 命令和 p 命令,= 命令告訴 sed 打印行號(hào),p 命令明確告訴 sed 打印該行(因?yàn)樘幱?-n 模式)。CODE:$ sed -n -e =;p myfile.txt 無論什么時(shí)候指定了兩個(gè)或更多命令,都按順序?qū)⒚總€(gè)命令應(yīng)用到文件的每一行。在上例中,首先將 = 命令應(yīng)用到第 1 行,然后應(yīng)用 p 命令。接著,sed 繼續(xù)處理第 2 行,并重復(fù)該過程。雖然分號(hào)很方便,但是在某些場合下,它不能正常工作。另一種替換方法是使用兩個(gè) -e 選項(xiàng)來指定兩個(gè)不同的命令:CODE:$ sed -n -e = -e p myfile.txt 然而,在使用更為復(fù)雜的附加和插入命令時(shí),甚至多個(gè) -e 選項(xiàng)也不能幫我們的忙。對(duì)于復(fù)雜的多行腳本,最好的方法是將命令放入一個(gè)單獨(dú)的文件中。然后,用 -f 選項(xiàng)引用該腳本文件:CODE:$ sed -n -f mycommands.sed myfile.txt 這種方法雖然可能不太方便,但總是管用。一個(gè)地址的多個(gè)命令有時(shí),可能要指定應(yīng)用到一個(gè)地址的多個(gè)命令。這在執(zhí)行許多 s/ 以變換源文件中的字和語法時(shí)特別方便。要對(duì)一個(gè)地址執(zhí)行多個(gè)命令,可在文件中輸入 sed 命令,然后使用 字符將這些命令分組,如下所示:CODE:1,20 s/Llinux/GNU/Linux/gs/samba/Samba/g s/posix/POSIX/g 上例將把三個(gè)替換命令應(yīng)用到第 1 行到第 20 行(包括這兩行)。還可以使用規(guī)則表達(dá)式地址或者二者的組合:CODE:1,/END/s/Llinux/GNU/Linux/g /samba/Samba/g s/posix/POSIX/gp 該例將把 之間的所有命令應(yīng)用到從第 1 行開始,到以字母 END 開始的行結(jié)束(如果在源文件中沒發(fā)現(xiàn) END,則到文件結(jié)束)的所有行。附加、插入和更改行既然在單獨(dú)的文件中編寫 sed 腳本,我們可以利用附加、插入和更改行命令。這些命令將在當(dāng)前行之后插入一行,在當(dāng)前行之前插入一行,或者替換模式空間中的當(dāng)前行。它們也可以用來將多行插入到輸出。插入行命令用法如下:CODE:i This line will be inserted before each line 如果不為該命令指定地址,那么它將應(yīng)用到每一行,并產(chǎn)生如下的輸出:CODE: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 如果要在當(dāng)前行之前插入多行,可以通過在前一行之后附加一個(gè)反斜杠來添加附加行,如下所示:CODE:i insert this line and this one and this one and, uh, this one too. 附加命令的用法與之類似,但是它將把一行或多行插入到模式空間中的當(dāng)前行之后
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳統(tǒng)技藝體驗(yàn)中心行業(yè)深度調(diào)研及發(fā)展項(xiàng)目商業(yè)計(jì)劃書
- 書法APP創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書
- 幼兒園環(huán)境衛(wèi)生自查整改措施
- 數(shù)字化車展現(xiàn)場互動(dòng)廣告投放協(xié)議
- 2025至2030年中國金融/證券系統(tǒng)市場分析及競爭策略研究報(bào)告
- 2025至2030年中國速凍深加工雞肉類方便食品市場分析及競爭策略研究報(bào)告
- 2025至2030年中國火鍋?zhàn)喜耸袌龇治黾案偁幉呗匝芯繄?bào)告
- 2025至2030年中國EVA防水板市場分析及競爭策略研究報(bào)告
- 2025至2030年中國麂皮面料市場分析及競爭策略研究報(bào)告
- 2025至2030莧菜籽行業(yè)產(chǎn)業(yè)運(yùn)行態(tài)勢(shì)及投資規(guī)劃深度研究報(bào)告
- 公司法務(wù)部職責(zé)與職能
- 泉州市石獅市2024-2025學(xué)年六年級(jí)下學(xué)期小升初數(shù)學(xué)考前押題卷含解析
- 物流倉儲(chǔ)設(shè)備選型與配置規(guī)范
- 水電工程驗(yàn)收單
- 2025年廣東省高中歷史學(xué)業(yè)水平考試綜合測(cè)評(píng)(一)歷史試題(原卷版+解析版)
- (2025)全國交管12123學(xué)法減分考試題庫附答案
- 攸縣2024-2025學(xué)年小學(xué)六年級(jí)第二學(xué)期小升初數(shù)學(xué)試卷含解析
- 安保主管上半年工作總結(jié)
- 撬裝加油站承包合同協(xié)議書
- 國家開放大學(xué)行管本科《政府經(jīng)濟(jì)學(xué)》期末考試總題庫2025春期考試版
評(píng)論
0/150
提交評(píng)論