Linux基礎命令---文字編輯sed

一生有你llx發表於2019-01-08

sed

sed 是一種流編輯器,用來從輸入流中讀取內容並完成轉換,輸入流可以來自一個檔案,也可以來自一個管道。

此命令的適用範圍:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。


1 、語法

sed [ 選項]  file

 

2 、選項列表

選項

說明

--version

顯示命令版本資訊

--help

顯示幫助文件

-n | --quite | --slient

靜默模式

-e | --expression=script

給指令新增指令碼

-f | --file=script-file

將檔案內容作為指令碼,追加給指令

--follow-symlinks

處理到位時遵循符號連結;硬連結仍將被破壞。

-i[SUFFIX]  |  --in-place[=SUFFIX]

編輯檔案到位(如果提供了副檔名,則進行備份)。預設的操作模式是中斷符號連結和硬連結。這可以通過跟隨符號連結和複製來改變。

-c  |  --copy

當在-i模式下對檔案進行洗牌時,請使用複製而不是重新命名。雖然這將避免斷開連結(符號或硬連結),但結果的編輯操作並不是原子操作。這很少是想要的模式;-遵循符號連結通常就足夠了,而且它更快、更安全。

-l | --line-length=N

指定每一行最大字元數,超過就自動換行

--posix

禁用所有的GNU表示式

-r | --regexp-extended

在指令碼中使用擴充套件正規表示式。

-s

將檔案看作是分離的,而不是單獨連續的長字串

-u | --unbuffered

從輸入檔案中載入最少數量的資料,並更頻繁地重新整理輸出緩衝區。

如果沒有給出-e、--expression,、-f或-file選項,那麼第一個非選項引數將作為sed指令碼進行解釋。其餘的引數都是輸入檔案的名稱;如果沒有指定輸入檔案,則讀取標準輸入。

 

命令

說明

沒有地址的命令


: label

b 和t命令的標籤

#comment

註釋將擴充套件到下一行(或-e指令碼片段的末尾)。

}

{} 塊的結束括號

沒有地址或者一個地址的命令


=

列印當前的行號

a \

text

追加文字,在換行符之前有一個嵌入的反斜槓

i \

text

插入文字,在換行符之前有一個嵌入的反斜槓

q [exit-code]

立即退出sed指令碼,而不處理任何更多的輸入,除非自動列印沒有被禁用,當前的模式空間將被列印出來。退出程式碼引數是一個GNU擴充套件。

Q [exit-code]

立即退出sed指令碼,而不處理任何更多的輸入。這是一個GNU擴充套件

r filename

附加從檔案中讀取的文字。

R filename

附加從檔案讀取的一行。命令的每次呼叫都從檔案中讀取一行。

接受地址範圍的命令


{

開始一個命令塊(以)結尾)

b label

分支到標籤;如果省略標籤,則分支到指令碼的末尾。

t label

如果“s///”自讀取上一個輸入行以來以及從最後一個t或T命令開始已成功地進行了替換,則從“分支到標籤”;如果省略“標籤”,則將其分支到指令碼的末尾。

T label

如果自讀取上一個輸入行以來,以及自最後一個t或T命令以來,沒有“s///”已成功地進行了替換,則從“分支到標籤”;如果省略“標籤”,則從“分支到指令碼的末尾”。這是一個GNU擴充套件。

c\

text

用文字替換徐那種的行,在換行符之前有一個嵌入的反斜槓

d

刪除模式空間。開始下一個週期。

D

刪除模式空間中的第一個嵌入換行符。開始下一個週期,但如果模式空格中仍然有資料,則跳過從輸入中讀取。

h H

複製/追加模式空間到保持空間

g G

複製/追加保持空間到模式空間

x

交換持有空格和模式空格的內容

l

以“視覺清晰”的形式列出當前行。

l width

以“視覺清晰”的形式列出當前行,在寬度width處將其拆分。這是一個GNU擴充套件。

n N

在模式空間中讀取/追加下一行輸入

p

列印到當前模式空間

P

列印到當前模式空間的第一個嵌入換行符

s/regexp/replacement/

嘗試將regexp與模式空間匹配。如果成功,則將該部分替換為替換部分。替換可以包含特殊字元&引用匹配的模式空間的那一部分,特殊轉義\1到\9引用regexp中相應的匹配子表示式。

w filename

將當前模式空間寫入檔名

W filename

將當前模式空間的第一行寫入檔名。這是一個GNU擴充套件。

y/source/dest/

將在源中出現的模式空間中的字元音譯為dst中相應的字元。

 

3 、地址

SED 命令可以在沒有地址的情況下給出,在這種情況下,命令將對所有輸入行執行;使用一個地址,則只對與該地址匹配的輸入行執行該命令;或者使用兩個地址,在這種情況下,將對所有與從第一個地址開始並繼續到第二個地址的包含行範圍匹配的輸入行執行命令。關於地址範圍,需要注意三件事:語法是addr 1,addr 2(即地址用逗號分隔);addr 1匹配的行將始終被接受,即使addr 2選擇了前面的行;如果addr 2是regexp,則不會根據addr 1匹配的行對其進行測試。

在地址(或地址範圍)之後,在命令之前,可以插入一個“!”,這指定只有當地址(或地址範圍)不匹配時才執行命令。支援以下的地址型別“

number ,只匹配指定的行號。

first~step ,從指定的行first開始,每step行匹配一次。

$ ,匹配最後一行。

/regexp/ ,匹配正規表示式regexp的行。

\cregexpc ,匹配正規表示式regexp的行。c可以是任何字元

0,addr2 ,從“匹配的第一個地址”狀態開始,直到找到addr 2為止。這類似於1,addr 2,但如果addr 2匹配輸入的第一行0,addr 2表單將位於其範圍的末尾,而1,addr 2窗體仍將位於其範圍的開頭。這隻在addr 2是正規表示式時才起作用。

addr1,+N ,將匹配addr 1和addr 1後面的N行。

addr1,~N ,將匹配addr 1和addr 1後面的行,直到輸入行號為N的倍數的下一行為止。

 

4 、例項

從一個檔案讀取內容輸入到另一個檔案

[root@192 weijie]#  cat 1.c                      // 檢視檔案內容

hello world, 

i am david. 

i love linux, 

love code.

nihao ed

[root@192 weijie]#  sed r 1.c >> 2.c           // 1.c 讀取,寫入到 2.c

[root@192 weijie]#  cat 2.c                      // 檢視內容

123

23

212

hello world, 

i am david. 

i love linux, 

love code.

nihao ed

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29270124/viewspace-2286510/,如需轉載,請註明出處,否則將追究法律責任。

相關文章