學(xué)習(xí)啦 > 學(xué)習(xí)電腦 > 操作系統(tǒng) > Linux教程 >

linux中sed命令字符串替換怎么用

時(shí)間: 加城1195 分享

  Linux系統(tǒng)中我們需要對(duì)用不上且大量的字符串替換,可以使用批量替換命令sed實(shí)現(xiàn),具體怎么操作呢?下面由學(xué)習(xí)啦小編為大家整理了linux系統(tǒng)中sed命令字符串替換的用法詳解,希望對(duì)大家有幫助!

  linux中sed命令字符串替換的用法詳解

  sed替換的基本語(yǔ)法為:

  sed 's/原字符串/替換字符串/'

  單引號(hào)里面,s表示替換,三根斜線(xiàn)中間是替換的樣式,特殊字符需要使用反斜線(xiàn)”\”進(jìn)行轉(zhuǎn)義,但是單引號(hào)”‘”是沒(méi)有辦法用反斜線(xiàn)”\”轉(zhuǎn)義的,這時(shí)候只要把命令中的單引號(hào)改為雙引號(hào)就行了,例如:

  sed "s/原字符串包含'/替換字符串包含'/" //要處理的字符包含單引號(hào)

  命令中的三根斜線(xiàn)分隔符可以換成別的符號(hào),這在要替換的內(nèi)容有較多斜線(xiàn)是較為方便,只需要緊跟s定義即可,例如換成問(wèn)號(hào)”?”:

  sed 's?原字符串?替換字符串?' //自定義分隔符為問(wèn)號(hào)

  可以在末尾加g替換每一個(gè)匹配的關(guān)鍵字,否則只替換每行的第一個(gè),例如:

  sed 's/原字符串/替換字符串/' //替換所有匹配關(guān)鍵字

  上箭頭”^”表示行首,美元”$”符號(hào)如果在引號(hào)中表示行尾,但是在引號(hào)外卻表示末行(最后一行),這里犯二了,搜了半天哪個(gè)符號(hào)表示首行,半天才想起來(lái),首行就是數(shù)字”1″啊.那么在行首和行尾添加字符串就是把行尾和行首替換,例如:

  sed 's/^/添加的頭部&/g' //在所有行首添加

  sed 's/$/&添加的尾部/g' //在所有行末添加

  sed '2s/原字符串/替換字符串/g' //替換第2行

  sed '$s/原字符串/替換字符串/g' //替換最后一行

  sed '2,5s/原字符串/替換字符串/g' //替換2到5行

  sed '2,$s/原字符串/替換字符串/g' //替換2到最后一行

  替換樣式可以多個(gè)在同一條命令中執(zhí)行,用分號(hào)”;”分隔,例如:

  sed 's/^/添加的頭部&/g;s/$/&添加的尾部/g' //同時(shí)執(zhí)行兩個(gè)替換規(guī)則

  sed處理過(guò)的輸出是直接輸出到屏幕上的,要保存可以將輸出重定向,或者使用參數(shù)”i”直接在文件中替換:

  sed -i 's/原字符串/替換字符串/g' filename //替換文件中的所有匹配項(xiàng)

  linux中sed命令批量替換字符串操作

  使用sed命令可以進(jìn)行字符串的批量替換操作,以節(jié)省大量的時(shí)間及人力;

  使用的格式如下:

  sed -i "s/oldstring/newstring/g" `grep oldstring -rl path

  其中,oldstring是待被替換的字符串,newstring是待替換oldstring的新字符串,grep操作主要是按照所給的路徑查找oldstring,path是所替換文件的路徑;

  -i選項(xiàng)是直接在文件中替換,不在終端輸出;

  -r選項(xiàng)是所給的path中的目錄遞歸查找;

  -l選項(xiàng)是輸出所有匹配到oldstring的文件;

  Linux系統(tǒng)中sed命令的常見(jiàn)用法實(shí)例

  # sed -e 's/123/1234/' a.txt

  將a.txt文件中所有行中的123用1234替換(-e表示命令以命令行的方式執(zhí)行;參數(shù)s,表示執(zhí)行替換操作)

  # sed -e '3,5 a4' a.txt

  將a.txt文件中的3行到5行之間所有行的后面添加一行內(nèi)容為4的行(參數(shù)a,表示添加行,參數(shù)a后面指定添加的內(nèi)容)

  # sed -e '1 s/12/45/' a.txt

  把第一行的12替換成45

  sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`

  批量處理通過(guò)grep搜索出來(lái)的所有文檔,將這些文檔中所有的oldstring用newstring替換(-i參數(shù)表示直接對(duì)目標(biāo)文件操作)

  $ sed -n 's/^test/mytest/p' example.file

  (-n)選項(xiàng)和p標(biāo)志一起使用表示只打印那些發(fā)生替換的行。也就是說(shuō),如果某一行開(kāi)頭的test被替換成mytest,就打印它。(^這是正則表達(dá)式中表示開(kāi)頭,該符號(hào)后面跟的就是開(kāi)頭的字符串)(參數(shù)p表示打印行)

  $ sed 's/^wangpan/&19850715/' example.file

  表示被替換換字符串被找到后,被替換的字符串通過(guò)&符號(hào)連接給出的字符串組成新字符傳替換被替換的字符串,所有以wangpan開(kāi)頭的行都會(huì)被替換成它自已加19850715,變成wangpan19850715

  $ sed -n 's/\(love\)able/\1rs/p' example.file

  love被標(biāo)記為1,所有l(wèi)oveable會(huì)被替換成lovers,而且替換的行會(huì)被打印出來(lái)。需要將這條命令分解,s/是表示替換操作,\(love\)表示選中l(wèi)ove字符串,\(love\)able/表示包含loveable的行,\(love\)able/\l表示love字符串標(biāo)記為1,表示在替換過(guò)程中不變。rs/表示替換的目標(biāo)字符串。這條命令的操作含義:只打印替換了的行

  $ sed 's#10#100#g' example.file

  不論什么字符,緊跟著s命令的都被認(rèn)為是新的分隔符,所以,“#”在這里是分隔符,代替了默認(rèn)的“/”分隔符。表示把所有10替換成100。

  $ sed -n '/love/,/unlove/p' example.file

  只打印包含love字符串行到包含unlove字符串行之間的所有行(確定行的范圍就是通過(guò)逗號(hào)實(shí)現(xiàn)的)

  $ sed -n '5,/^wang/p' example

  只打印從第五行開(kāi)始到第一個(gè)包含以wang開(kāi)始的行之間的所有行

  $ sed '/love/,/unlove/s/$/wangpan/' example.file

  對(duì)于包含love字符串的行到包含unlove字符串之間的行,每行的末尾用字符串wangpan替換。

  字符串$/表示以字符串結(jié)尾的行,$/表示每一行的結(jié)尾,s/$/wangpan/表示每一行的結(jié)尾添加wangpan字符串

  $ sed -e '11,53d' -e 's/wang/pan/' example.file

  (-e)選項(xiàng)允許在同一行里執(zhí)行多條命令。如例子所示,第一條命令刪除11至53行,第二條命令用pan替換wang。命令的執(zhí)行順序?qū)Y(jié)果有影響。如果兩個(gè)命令都是替換命令,那么第一個(gè)替換命令將影響第二個(gè)替換命令的結(jié)果。(參數(shù)d,表示刪除指定的行)

  $ sed --expression='s/wang/pan/' --expression='/love/d' example.file

  一個(gè)比-e更好的命令是--expression。它能給sed表達(dá)式賦值。

  $ sed '/wangpan/r file' example.file

  file里的內(nèi)容被讀進(jìn)來(lái),顯示在與wangpan匹配的行后面,如果匹配多行,則file的內(nèi)容將顯示在所有匹配行的下面。參數(shù)r,表示讀出文件,后面空格緊跟文件名稱(chēng)

  $ sed -n '/test/w file' example.file

  在example.file中所有包含test的行都被寫(xiě)入file里。參數(shù)w,表示將匹配的行寫(xiě)入到指定的文件file中

  $ sed '/^test/a\oh! My god!' example.file

  'oh! My god!'被追加到以test開(kāi)頭的行的后面,sed要求參數(shù)a后面有一個(gè)反斜杠。

  $ sed '/test/i\oh! My god!' example.file

  'oh! My god!'被追加到包含test字符串行的前面,參數(shù)i表示添加指定內(nèi)容到匹配行的前面,sed要求參數(shù)i后面有一個(gè)反斜杠

  $ sed '/test/{ n; s/aa/bb/; }' example.file

  如果test被匹配,則移動(dòng)到匹配行的下一行,替換這一行的aa,變?yōu)閎b。參數(shù)n,表示讀取匹配行的下一個(gè)輸入行,用下一個(gè)命令處理新的行而不是匹配行。Sed要求參數(shù)n后跟分號(hào)

  $ sed '1,10y/abcde/ABCDE/' example.file

  把1—10行內(nèi)所有abcde轉(zhuǎn)變?yōu)榇髮?xiě),注意,正則表達(dá)式元字符不能使用這個(gè)命令。參數(shù)y,表示把一個(gè)字符翻譯為另外的字符(但是不用于正則表達(dá)式)

  $ sed -i 's/now/right now/g' test_sed_command.txt

  表示直接操作文件test_sed_command.txt,將文件test_sed_command.txt中所有的now用right now替換。參數(shù)-i,表示直接操作修改文件,不輸出。

  $ sed '2q' test_sed_command.txt

  在打印完第2行后,就直接退出sed。參數(shù)q,表示退出

  $ sed -e '/old/h' -e '/girl-friend/G' test_sed_command.txt

  首先了解參數(shù)h,拷貝匹配成功行的內(nèi)容到內(nèi)存中的緩沖區(qū)。在了解參數(shù)G,獲得內(nèi)存緩沖區(qū)的內(nèi)容,并追加到當(dāng)前模板塊文本的后面。上面命令行的含義:將包含old字符串的行的內(nèi)容保存在緩沖區(qū)中,然后將緩沖區(qū)的內(nèi)容拿出來(lái)添加到包含girl-friend字符串行的后面。隱含要求搜集到緩沖區(qū)的匹配行在需要添加行的前面。

  $ sed -e '/test/h' -e '/wangpan/x' example.file

  將包含test字符串的行的內(nèi)容保存在緩沖區(qū)中,然后再將緩沖區(qū)的內(nèi)容替換包含wangpan字符串的行。參數(shù)x,表示行替換操作。隱含要求搜集到緩沖區(qū)的匹配行在需要被替換行的前面。

3973328