性夜影院午夜看片,无码精品久久一区二区三区,婷婷成人丁香五月综合激情,校园春色 qvod,性调教室高h学校

Linux系統(tǒng)中關(guān)于流編輯器sed的介紹

今天小編要跟大家分享的文章是關(guān)于Linux系統(tǒng)中關(guān)于流編輯器sed的介紹。正在從事Linux相關(guān)工作的小伙伴們是否sed有所了解呢? Linux入門(mén)新手和正在Linux學(xué)習(xí)的小伙伴快來(lái)看一看吧,希望能夠?qū)Υ蠹矣兴鶐椭?/p>

一、流編輯器sed與命令sed

Linux中,常使用流編輯器sed進(jìn)行文本替換工作。與常使用的交互式編輯器(如vim)不同,sed編輯器以批處理的方式來(lái)編輯文件,這比交互式編輯器快得多,可以快速完成對(duì)數(shù)據(jù)的編輯修改。

一般來(lái)說(shuō),sed編輯器會(huì)執(zhí)行以下操作:

1)一次從輸入中讀取一行數(shù)據(jù);

2)根據(jù)所提供的編輯器命令匹配數(shù)據(jù);

3)按照命令修改流中的數(shù)據(jù);

4)將新的數(shù)據(jù)輸出到STDOUT。

在sed編輯器匹配完一行數(shù)據(jù)后,它會(huì)讀取下一行數(shù)據(jù)并重復(fù)這個(gè)過(guò)程,直到處理完所有數(shù)據(jù)。使用sed命令打開(kāi)一個(gè)sed編輯器。sed命令的格式如下:

sed?[options]?edit_commands?[file]#?[?]?中的內(nèi)容為可選可不選

其中,options為命令選項(xiàng),選擇不同的options可以修改sed命令的行為,主要有3個(gè)選項(xiàng):

1)-e選項(xiàng):?在處理輸入時(shí),將script中指定的編輯命令添加到已有的命令中。通俗的說(shuō),就是在sed后面直接添加編輯命令:

sed?-e?'edit_commands'?[files]

sed命令在默認(rèn)情況下使用的是-e選項(xiàng)。當(dāng)只有一個(gè)編輯命令時(shí),-e選項(xiàng)可以省略;但是當(dāng)要在一條sed語(yǔ)句中執(zhí)行多個(gè)編輯命令時(shí),就需要使用-e選項(xiàng)了:

sed?-e?'s/root/ROOT/g;?s/bin/BIN/g'?/etc/passwd?????#?使用?sed?同時(shí)執(zhí)行兩條編輯命令(本文大部分用例都直接使用?/etc/passwd?文件)

sed?-e?'s/root/ROOT/g'?-e?'s/bin/BIN/g'?/etc/passwd?#?使用?sed?同時(shí)執(zhí)行兩條編輯命令

2)-f選項(xiàng):在處理輸入時(shí),將file中指定的編輯命令添加到已有的命令中:

前面提到,在需要同時(shí)執(zhí)行多條編輯命令時(shí),可以使用-e選項(xiàng)。但是當(dāng)所需要執(zhí)行的編輯命令數(shù)量很多時(shí),每次使用sed時(shí)一行一行地敲顯然不是很方便,這時(shí)可以將所用到的sed編輯命令寫(xiě)入一個(gè)文件,然后使用sed -f選項(xiàng)來(lái)指定讀取該文件:

$?cat?script.sed
$?s/root/ROOT/
$?s/bin/BIN/
$?s/home/HOME/

sed?-f?script.sed?/etc/passwd

3)-n選項(xiàng):?不產(chǎn)生命令輸入:

sed?-n?'s/root/ROOT/'?/etc/passwd

使用-n選項(xiàng)不會(huì)將流編輯器的內(nèi)容輸出到STDOUT,通常將-n選項(xiàng)與p命令結(jié)合起來(lái)使用,以只打印被匹配的行。

除了這三個(gè)選項(xiàng)外,sed編輯器還提供了許多命令,用來(lái)進(jìn)行更詳細(xì)的操作,簡(jiǎn)單列一下,后面再仔細(xì)介紹:

命令 描述
s 文本替換操作
d 刪除操作
i 插入操作
a 附加操作
c 將一行文本修改為新的行
y 逐字符替換
p 打印文本行
= 打印行號(hào)
w 向文件中寫(xiě)入數(shù)據(jù)
r 從文件中讀取數(shù)據(jù)

二、使用sed命令進(jìn)行文本替換

sed使用s命令來(lái)進(jìn)行文本替換操作,基本格式如下:

sed?'s/srcStr/dstStr/'?file

其中,srcStr為想要替換的文本,dstStr為將要替換成的文本。使用s命令時(shí),sed編輯器會(huì)在一行一行地讀取文件file,并在每行查找文本srcStr,如果找到了,則將該處的srcStr替換為dstStr。

/字符為界定符,用于分隔字符串(sed編輯器允許使用其他字符作為替換命令中的字符串分隔符):

sed?'s!/bin/bash!/BIN/BASH!'?/etc/passwd????#?使用?!?作為字符串分隔符

默認(rèn)情況下,替換命令只會(huì)替換掉目標(biāo)文本在每行中第一次出現(xiàn)的地方。若想要替換掉每行中所有匹配的地方,可以使用替換標(biāo)記g。替換標(biāo)記放在編輯命令的末尾。除了g外,還有幾種替換標(biāo)記:

1)數(shù)字:指明替換掉第幾次匹配到的文本,沒(méi)有設(shè)置這個(gè)標(biāo)記時(shí),默認(rèn)是替換第一次匹配的文本:

sed?'s/root/ROOT/2'?/etc/passwd

這行命令將/etc/passwd文件中每行的第2個(gè)root替換為ROOT;

2)g?:替換所有匹配到的文本:

sed?'s/root/ROOT/g'?/etc/passwd

這行命令將/etc/passwd文件中的root,全部替換為ROOT;

3)p?:打印與替換命令中指定模式(srcStr)相匹配的行:

sed?'s/root/ROOT/p'?/etc/passwd

執(zhí)行這命令,會(huì)在STDOUT上看到包含有root的行被輸出了兩次,一次是sed編輯器自動(dòng)輸出的;另一次則是p標(biāo)記打印出來(lái)的匹配行。

單獨(dú)地使用p標(biāo)記沒(méi)什么用處,通常將p標(biāo)記和-n選項(xiàng)結(jié)合起來(lái)使用,這樣就可以只輸出被匹配替換過(guò)的行了:

ed?-n?'s/root/ROOT/gp'?/etc/passwd#?將?/etc/passwd?中所有的?root?都替換成?ROOT,并輸出被修改的行

注:可以使用" = "命令來(lái)打印行號(hào),用法與p一樣。

4)w file?:將替換的結(jié)果寫(xiě)到文件中,不過(guò)只保存被修改的行,與-n + p的功能類似:

sed?-n?'s/root/ROOT/g?w?change.txt'?/etc/passwd?#?將?/etc/passwd?中所有的?root?都替換成?ROOT,并將被修改的行保存到文件?change.txt?中去

三、使用行尋址對(duì)特定行進(jìn)行編輯

默認(rèn)情況下,sed編輯器會(huì)對(duì)文件中的所有行進(jìn)行編輯。當(dāng)然,也可以只指定特定的某些行號(hào),或者行范圍來(lái)進(jìn)行流編輯,這需要用到行尋址。所指定的行地址放在編輯命令之前:

[address]?commands

3.1使用數(shù)字方式進(jìn)行行尋址

sed編輯器將文本流中的每一行都進(jìn)行編號(hào),第一行的編號(hào)為1,后面的按順序分配行號(hào)。通過(guò)指定特定的行號(hào),可以選擇編輯特定的行。舉幾個(gè)例子:

sed?'3?s/bin/BIN/g'?/etc/passwd#?將第3行中所有的?bin?替換成?BIN

sed?'2,5?s/bin/BIN/g'?/etc/passwd?#?將第2到5行中所有的?bin?替換成?BIN

sed?'10,$?s/bin/BIN/g'?/etc/passwd#?將第10行到最后一行中所有的?bin?替換成?BIN

注:行尋址不止對(duì)替換命令有效,對(duì)其他命令也都是有效的,后面也會(huì)用到。

3.2使用文本模式過(guò)濾器過(guò)濾行

sed編輯器允許指定文本模式來(lái)過(guò)濾出命令要作用的行,格式如下:

/pattern/command

必須使用斜杠符" / "將要指定的文本模式pattern包含起來(lái)。sed編輯器會(huì)尋找匹配文本模式的行,然后對(duì)這些行執(zhí)行編輯命令:

sed?-n?'/root/s/bin/BIN/p'?/etc/passwd????#?尋找包含有字符串?root?的行,并將匹配行的?bin?替換為?BIN

與數(shù)字尋址一樣,也可以使用文本過(guò)濾區(qū)間來(lái)過(guò)濾行:

sed?'/pattern1/,/pattern2/?edit_command'?file

這行命令會(huì)在文件file中先尋找匹配pattern1的行,然后從該行開(kāi)始,執(zhí)行編輯命令,直到找到匹配pattern2?的行。但是需要注意的是,使用文本區(qū)間過(guò)濾文本時(shí),只要匹配到了開(kāi)始模式(pattern1),編輯命令就會(huì)開(kāi)始執(zhí)行,直到匹配到結(jié)束模式(pattern2),這會(huì)導(dǎo)致一種情況:一個(gè)文本中,先匹配到了一對(duì)pattern1、pattern2,對(duì)該文本區(qū)間中的文本執(zhí)行了編輯命令;然后,在pattern2之后又匹配到了pattern1,這時(shí)就會(huì)再次開(kāi)始執(zhí)行編輯命令,因此,在使用文本區(qū)間過(guò)濾時(shí)要格外小心。舉個(gè)例子:

sed?-n?'/root/,/nologin/?s/bin/BIN/p'?/etc/passwd

這行命令對(duì)/etc/passwd進(jìn)行了兩次文本區(qū)間匹配,結(jié)果如下:

Linux系統(tǒng)中關(guān)于流編輯器sed的介紹

四、使用sed命令刪除行

sed編輯器使用d命令來(lái)刪除文本流中的特定行。使用d命令時(shí),一般需要帶上位尋址,以刪除指定的行,否則默認(rèn)會(huì)刪除所有文本行:

sed?'/root/d'?/etc/passwd??#?刪除匹配?root?的行

sed?'2,$d'?/etc/passwd#?刪除第2到最后一行

五、使用sed命令插入和附加文本

sed編輯器使用i命令來(lái)向數(shù)據(jù)流中插入文本行,使用a命令來(lái)向數(shù)據(jù)流中附加文本行。其中:i命令會(huì)在指定行前增加一個(gè)新行;a命令會(huì)在指定行后增加一個(gè)新行。

需要注意的是,這兩個(gè)命令都不能在單個(gè)命令行上使用(即不是用來(lái)在一行中插入或附加一段文本的),只能指定插入還是附加到另一行。命令格式如下:

sed?'[address][i?|?a]newline'?file

newline中的文本即為將要插入或附加在一行前面或后面的文本。常常使用這兩個(gè)命令結(jié)合行尋址在特定的行前面或后面增加一個(gè)新行。舉個(gè)例子:

sed?'iInsert?a?line?behind?every?line'?/etc/passwd#?向數(shù)據(jù)流的每一行前面增加一個(gè)新行,新行的內(nèi)容為??后面的內(nèi)容

sed?'1iInsert?a?line?behind?the?first?line'?/etc/passwd#?在數(shù)據(jù)流的第一行前面增加一個(gè)新行

sed?'3aAppend?a?line?after?the?third?line'?/etc/passwd??????#?在數(shù)據(jù)流的第三行后面增加一個(gè)新行

sed?'$aAppend?a?line?in?the?last?line'?/etc/passwd#?在數(shù)據(jù)流的最后一行后面增加一個(gè)新行

六、使用sed命令修改行

使用命令c可以將數(shù)據(jù)流中的整行文本修改為新的行,與插入、附加操作一樣,這要求在sed命令中指定新的行,格式如下:

sed?'[address][c]newtext'?file

newtext中的文本為匹配行將要被修改成的文本。

sed?'3?cNew?text'?/etc/passwd#?將數(shù)據(jù)流中第三行的內(nèi)容修改為??后面的內(nèi)容

sed?'/root/?cNew?text'?/etc/passwd#?將匹配到?root?的行的內(nèi)容修改為??后面的內(nèi)容

sed?'2,4cNew?text'?/etc/passwd?#?將第2到4行的內(nèi)容修改為??后面的內(nèi)容,但是不是逐行修改,而是會(huì)將這之間的?3?行用一行文本來(lái)替代

注意這里對(duì)地址區(qū)間使用c命令進(jìn)行修改時(shí),不會(huì)逐行修改,而是會(huì)將整個(gè)區(qū)間用一行修改文本替代。?

七、使用sed命令逐字符轉(zhuǎn)換

使用y參數(shù)可以按要求對(duì)文本進(jìn)行逐字符轉(zhuǎn)換。格式如下:

[address]y/inchars/outchars/

轉(zhuǎn)換命令會(huì)對(duì)inchars和outchars的值進(jìn)行一對(duì)一的映射。inchars中的第一個(gè)字符會(huì)被轉(zhuǎn)換成outchars中的第一個(gè)字符;inchars中的第二個(gè)字符會(huì)被轉(zhuǎn)換成outchars中的第二個(gè)字符;...直到處理完一行。如果inchars和outchars的長(zhǎng)度不同,則sed編輯器會(huì)產(chǎn)生一個(gè)錯(cuò)誤消息。舉個(gè)例子:

echo?abcdefggfedcba?|?sed?'y/acg/ACG/'

輸出結(jié)果為AbCdefGGfedCbA。

八、使用sed命令處理文件

8.1向文件中寫(xiě)入數(shù)據(jù)

前面已經(jīng)提到過(guò),可以使用w命令向文件寫(xiě)入行。格式如下:

[address]w?filename

舉個(gè)例子:

sed?'1,2w?test.txt'?/etc/passwd

該語(yǔ)句將數(shù)據(jù)流的第1、2行寫(xiě)入文件test.txt中去。?

8.2從文件中讀取數(shù)據(jù)

可以使用r命令來(lái)將一個(gè)文本中的數(shù)據(jù)插入到數(shù)據(jù)流中去,與普通的插入命令i類似,這也是對(duì)行進(jìn)行操作的,命令格式如下:

[address]r?filename

filename為要插入的文件。r命令常結(jié)合行尋址使用,以將文本插入到指定的行后面。舉個(gè)例子:

sed?'3?r?test.txt'?/etc/passwd?

這句話將文件test.txt中的內(nèi)容插入到數(shù)據(jù)流第三行后面去。

以上就是小編今天為大家分享的關(guān)于Linux系統(tǒng)中關(guān)于流編輯器sed的介紹的文章,希望本篇文章能夠?qū)φ趶氖翷inux相關(guān)工作的小伙伴們有所幫助。想要了解更多Linux相關(guān)知識(shí)的小伙伴記得關(guān)注馬哥教育官網(wǎng)。最后祝愿小伙伴們工作順利!

聲明:文章來(lái)源于網(wǎng)絡(luò),侵刪!

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國(guó)內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開(kāi)發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!