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 會出現問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535771.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535771.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535771.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle GoldenGate簡介

一、什么是Oracle GoldenGate&#xff1f; Oracle GoldenGate是用于實時數據集成和復制的綜合軟件包。它支持高可用性解決方案&#xff0c;實時數據集成&#xff0c;事務性更改數據捕獲&#xff0c;數據復制&#xff0c;轉換以及運營和分析企業系統之間的驗證。 使用Oracle G…

sed教程入門與實例練習(三)

在第二篇 sed 文章中&#xff0c;我提供了一些示例來演示 sed 的工作原理&#xff0c;但是它們當中很少有示例能實際做特別有用的事。在這篇 sed 系列的最后文章中&#xff0c;我要改變那種方式&#xff0c;并使用 sed 來做實際的事。我將為您顯示幾個示例&#xff0c;它們不僅…

Oracle GoldenGate微服務架構

Oracle GoldenGate支持兩種架構&#xff0c;經典架構和微服務架構&#xff08;MA&#xff09;。 可以出于以下目的配置Oracle GoldenGate&#xff1a; 從一個數據庫中靜態提取數據記錄&#xff0c;并將這些記錄加載到另一個數據庫中。連續提取和復制事務性數據處理語言&#…

Oracle GoldenGate經典架構

可以使用Oracle GoldenGate Classic Architecture從命令行配置和管理數據復制。 圖示的說明logicalarch2.png 注意&#xff1a; 這是基本配置。根據業務需求和用例&#xff0c;可以配置此模型的不同變體。 1、Manager Manager是Oracle GoldenGate的控制過程。必須先在Oracl…

WordPress 首頁顯示摘要

這里的方法不需要你另外裝插件。 1、使用more標簽 (缺點&#xff1a;每次都要加一下這個東西&#xff0c;不靈活只能一刀切。優點&#xff1a;方法比較正規不需要改動模版) 在你需要截斷的地方(就是你的編輯框)加 <!–more–> 代碼. 2、使用the_excerpt標簽 (缺點&#x…

Oracle GoldenGate復制過程

這兩種Oracle GoldenGate體系結構共有許多數據復制過程。 1、什么是Extract&#xff1f; Extract是一個過程&#xff0c;該過程被配置為針對源數據庫運行或被配置為在下游挖掘數據庫&#xff08;僅Oracle&#xff09;上運行&#xff0c;以捕獲在其他位置的真實源數據庫中生成…

awk教程入門與實例練習(一)

Awk 是一種非常好的語言&#xff0c;同時有一個非常奇怪的名稱。在本系列&#xff08;共三篇文章&#xff09;的第一篇文章中&#xff0c;Daniel Robbins 將使您迅速掌握 awk 編程技巧。隨著本系列的進展&#xff0c;將討論更高級的主題&#xff0c;最后將演示一個真正的高級 a…

HDFS-簡介

HDFS 是 Hadoop Distribute File System 的簡稱&#xff0c;意為&#xff1a;Hadoop 分布式文件系統&#xff0c;是一種旨在在商品硬件上運行的分布式文件系統。它與現有的分布式文件系統有許多相似之處。但是&#xff0c;與其他分布式文件系統的區別很明顯。HDFS具有高度的容錯…

awk教程入門與實例練習(二)

在這篇 awk 簡介的續集中&#xff0c;Daniel Robbins 繼續探索 awk&#xff08;一種很棒但有怪異名稱的語言&#xff09;。Daniel 將演示如何處理多行記錄、使用循環結構&#xff0c;以及創建并使用 awk 數組。閱讀完本文后&#xff0c;您將精通許多 awk 的功能&#xff0c;而且…

HDFS-配置項

一、core-site.xml與core-default.xml core-default.xml與core-site.xml的功能是一樣的&#xff0c;如果在core-site.xml里沒有配置的屬性&#xff0c;則會自動會獲取core-default.xml里的相同屬性的值 <configuration><property><!-- 這個屬性用來指定namenod…

awk教程入門與實例練習(三)

在 awk 系列的這篇總結中&#xff0c;Daniel 向您介紹 awk 重要的字符串函數&#xff0c;以及演示了如何從頭開始編寫完整的支票簿結算程序。在這個過程中&#xff0c;您將學習如何編寫自己的函數&#xff0c;并使用 awk 的多維數組。學完本文之后&#xff0c;您將掌握更多 awk…

HDFS-常用命令

1. -help&#xff1a;顯示幫助信息 hadoop fs -help rmshel2. -ls&#xff1a;顯示目錄信息 hadoop fs -ls /3. -mkdir&#xff1a;在HDFS上創建目錄 hadoop fs -mkdir -p /user/ha4. -moveFromLocal&#xff1a;從本地剪切粘貼到HDFS hadoop fs -moveFromLocal ~/test.txt…

如何關閉WINDOWS2003 DEP數據保護功能

近來很多朋友和客戶都使用了WINDOWS2003來架設自己的GAME SERVER,但有很多朋友反映說,不如WINDOWS2000好,原因不是穩定,而是成功率高,和簡單.但我個人覺得WINDOWS2003還是不錯的系統,如果朋友們都不用這個系統,而用WINDOWS2000 有點不值得了.我就開始找尋這樣的問題.我對GAME 不…

JDK源碼解析之 java.lang.Thread

位于java.lang包下的Thread類是非常重要的線程類&#xff0c;它實現了Runnable接口&#xff0c;今天我們來學習一下Thread類&#xff0c;在學習Thread類之前&#xff0c;先介紹與線程相關知識&#xff1a;線程的幾種狀態、上下文切換&#xff0c;然后接著介紹Thread類中的方法的…

TASKLIST

TASKLIST [/S system [/U username [/P [password]]]] [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]參數列表:/S system 指定連接到的遠程系統。/U [domain/]user 指定使用哪個用戶執行這個命令。/P [password] 為指定的用戶指定密碼。/SVC 顯示每個進程中的服務…

JDK源碼解析之 java.lang.ThreadLocal

此類提供線程局部變量。這些變量與普通變量不同&#xff0c;每個訪問一個線程&#xff08;通過其get或set方法&#xff09;的線程 都有其自己的&#xff0c;獨立初始化的變量副本。 ThreadLocal實例通常是希望將狀態與線程關聯的類中的私有靜態字段&#xff08;例如&#xff0c…

華爾街頂級大師胡立陽名言

1.不要聽“親朋好友”的話&#xff0c;他們只會讓你成為“平凡人”。 2.不要只會“用功讀書”&#xff0c;重要的是“要讀對書”。  3&#xff0e;不要只是“努力工作”&#xff0c;重要的是“做對工作”。   4.不要指示結交“志趣相投”的朋友&#xff0c;否則你永遠只看到…

JDK源碼解析之 Java.lang.Enum

Enum是一個特殊的類. 我們不能以class Xxx extends Enum的方式手動繼承, 必須寫成enum Xxx的形式; 然而這段枚舉類的定義在編譯之后又變回了class Xxx extends Enum. 一、類定義 public abstract class Enum<E extends Enum<E>>implements Comparable<E>, …

Linux下的一些簡單網絡配置命令介紹

1、 ifconfig可以使用ifconfig命令來配置并查看網絡接口的配置情況。例如&#xff1a;&#xff08;1&#xff09; 配置eth0的IP地址&#xff0c; 同時激活該設備。#ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up&#xff08;2&#xff09; 配置eth0別名設備eth0:1的IP地…

JDK源碼解析之 java.lang.Throwable

在 Java 中&#xff0c;所有的異常都有一個共同的祖先 Throwable&#xff08;可拋出&#xff09;。Throwable 指定代碼中可用異常傳播機制通過 Java 應用程序傳輸的任何問題的共性。 一、類定義 public class Throwable implements Serializable {}Serializable&#xff1a;可…