① 文本處理之sed
[root@www ~]# sed [-nefr] [動作]
1 p命令 ->列印
命令p用於顯示模式空間的內容。默認情況下,sed把輸入行列印在屏幕上,選項-n用於取消默認的列印操作。當選項-n和命令p同時出現時,sed可列印選定的內容。
sed '/my/p' datafile
sed -n '/my/p' datafile
命令d用於刪除輸入行。sed先將輸入行從文件復制到模式空間里,然後對該行執行sed命令,最後將模式空間里的內容顯示在屏幕上。如果發出的是命令d,當前模式空間里的輸入行會被刪除,不被顯示。
sed '$d' datafile
sed '/my/d' datafile
sed 's/^My/You/g' datafile
sed -n Ƈ,20s/My$/You/gp' datafile
sed 's#My#Your#g' datafile
-e是編輯命令,用於sed執行多個編輯任務的情況下。在下一行開始編輯前,所有的編輯動作將應用到模式緩沖區中的行上。
sed -e Ƈ,10d' -e 's/My/Your/g' datafile
r命令是讀命令。sed使用該命令將一個文本文件中的內容加到當前文件的特定位置上。
sed '/My/r introce.txt' datafile
sed -n '/hrwang/w me.txt' datafile
a 命令是追加命令,追加將添加新文本到文件中當前行(即讀入模式緩沖區中的行)的後面。所追加的文本行位於sed命令的下方另起一行。如果要追加的內容超過一行,則每一行都必須以反斜線結束,最後一行除外。最後一行將以引號和文件名結束。
sed '/^hrwang/a
i 命令是在當前行的前面插入新的文本。
sed使用該命令將已有文本修改成新的文本。
該命令與UNIX/linux中的tr命令類似,字元按照一對一的方式從左到右進行轉換。例如,y/abc/ABC/將把所有小寫的a轉換成A,小寫的b轉換成B,小寫的c轉換成C。
sed Ƈ,20y/hrwang12/HRWANG^$/' datafile
q命令將導致sed程序退出,不再進行其它的處理。
sed '/hrwang/{s/hrwang/HRWANG/;q;}' datafile
sed -i 's/ /,/g' filename //把tab 替換成 「,」
cat filename | sed 's/[ ][ ] /,/g' cat lse | sed 's/s+/,/g' 替換空格
cat lse | sed -e 's/[[:space:]][[:space:]] /,/g' 如果空格與tab共存時用
1:把文件filename中的a字元換成A字元
sed -i "s/a/A/g" filename
2:替換為空格 將tab替換為空格
sed -i "s/ / /g" filename
二、實例
1)替換:s命令
將a.txt文件中所有行中的123用1234替換(-e表示命令以命令行的方式執行;參數s,表示執行替換操作)
把第一行的12替換成45
(-n)選項和p標志一起使用表示只列印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就列印它。(^這是正則表達式中表示開頭,該符號後面跟的就是開頭的字元串)(參數p表示列印行)
love被標記為1,所有loveable會被替換成lovers,而且替換的行會被列印出來。需要將這條命令分解,s/是表示替換操作,love表示選中love字元串,loveable/表示包含loveable的行,loveable/l表示love字元串標記為1,表示在替換過程中不變。rs/表示替換的目標字元串。這條命令的操作含義:只列印替換了的行
不論什麼字元,緊跟著s命令的都被認為是新的分隔符,所以,「#」在這里是分隔符,代替了默認的「/」分隔符。表示把所有10替換成100
表示直接操作文件test_sed_command.txt,將文件test_sed_command.txt中所有的now用right now替換。參數-i,表示直接操作修改文件,不輸出
將小數點及之後的內容清除,以上輸出是112(.表示匹配"."符號,之後跟著. 表示1個到多個字元,如果只是. 的話,只會匹配"."字元,因為*號是0個到多個)
輸出:aaaa.mpg
表示被替換換字元串被找到後,被替換的字元串通過&符號連接給出的字元串組成新字元傳替換被替換的字元串,所有以wangpan開頭的行都會被替換成它自已加19850715,變成wangpan19850715
2)選定行范圍,逗號
將a.txt文件中的3行到5行之間所有行的後面添加一行內容為4的行(參數a,表示添加行,參數a後面指定添加的內容)
只列印包含love字元串列到包含unlove字元串列之間的所有行(確定行的范圍就是通過逗號實現的)
只列印從第五行開始到第一個包含以wang開始的行之間的所有行
3)編輯 e命令
一個比-e更好的命令是--expression。它能給sed表達式賦值。
(-e)選項允許在同一行里執行多條命令。如例子所示,第一條命令刪除11至53行,第二條命令用pan替換wang。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。(參數d,表示刪除指定的行)
4)從文件讀寫:r命令和w命令
file里的內容被讀進來,顯示在與wangpan匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。參數r,表示讀出文件,後面空格緊跟文件名稱
在example.file中所有包含test的行都被寫入file里。參數w,表示將匹配的行寫入到指定的文件file中
5)追加和插入命令:a命令和i命令
'this is a example'被追加到以test開頭的行後面,sed要求命令a後面有一個反斜杠。
6)變形:y命令
把1-10行內所有abcde轉變為大寫,注意,正則表達式元字元不能使用這個命令。參數y,表示把一個字元翻譯為另外的字元(但是不用於正則表達式)
7)保持和獲取:h命令和G命令
首先了解參數h,拷貝匹配成功行的內容到內存中的緩沖區。在了解參數G,獲得內存緩沖區的內容,並追加到當前模板塊文本的後面。上面命令行的含義:將包含old字元串的行的內容保存在緩沖區中,然後將緩沖區的內容拿出來添加到包含girl-friend字元串列的後面。隱含要求搜集到緩沖區的匹配行在需要添加行的前面
8)保持和互換:h命令和x命令
將包含test字元串的行的內容保存在緩沖區中,然後再將緩沖區的內容替換包含wangpan字元串的行。參數x,表示行替換操作。隱含要求搜集到緩沖區的匹配行在需要被替換行的前面
三、收集
2.#sed -e 's/123/1234/g' a.txt
將a.txt文件中所有行中的123用1234替換,每行匹配多次(-e表示命令以命令行的方式執行;參數s,表示執行替換操作;參數g,表示每行匹配多次,不改變原文件)
3.# sed -e Ɖ,5 a4' a.txt
將a.txt文件中的3行到5行之間所有行的後面添加一行內容為4的行(參數a,表示添加行,參數a後面指定添加的內容,不改變原文件)
4.# sed -e Ƈ s/12/45/' a.txt
把第一行的12替換成45(不改變原文件)
5.#sed -i "s/456aaa/444aaa/" grep 456aaa -lr /mnt/
在/mnt/share目錄下所有的文件及所有子目錄下的文件中找出包括aaa456的文件(不包括文件夾),將找出來的文件中的456aaa替換成444aaa(-i表示直接改變文件)
6.#sed -n 's/^test/mytest/p' example.file
(-n)選項和p標志一起使用表示只列印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就列印它。(^這是正則表達式中表示開頭,該符號後面跟的就是開頭的字元串)(參數p表示列印行)
7.#sed 's/^wangpan/&19850715/' example.file
表示被替換換字元串被找到後,被替換的字元串通過&符號連接給出的字元串組成新字元傳替換被替換的字元串,所有以wangpan開頭的行都會被替換成它自已加19850715,變成wangpan19850715
8.#sed -n 's/loveable/1rs/p' example.file
love被標記為1,所有loveable會被替換成lovers,而且替換的行會被列印出來。需要將這條命令分解,s/是表示替換操作,love表示選中love字元串,loveable/表示包含loveable的行,loveable/1表示love字元串標記為1,表示在替換過程中不變。rs/表示替換的目標字元串。這條命令的操作含義:只列印替換了的行,如果替換字元和被替換字元有部分內容相同,則可用這種標記方法
9.#sed 's#10#100#g' example.file
不論什麼字元,緊跟著s命令的都被認為是新的分隔符,所以,「#」在這里是分隔符,代替了默認的「/」分隔符,但是在一個表達示中,不能把不同字元混合用作分隔符。表示把所有10替換成100。
10.#sed -n '/love/,/unlove/p' example.file
只列印包含love字元串列到包含unlove字元串列之間的所有行,如果找不到unlove,則一直到最後一行(確定行的范圍就是通過逗號實現的)
11.#sed -n Ƌ,/^wang/p' example
只列印從第五行開始到第一個包含以wang開始的行之間的所有行
12.#sed '/love/,/unlove/s/$/jeffery/p' example.file
對於包含love字元串的行到包含unlove字元串之間的行,每行的末尾用字元串jeffery替換。
字元串$/表示以字元串結尾的行,$/表示每一行的結尾,s/$/jeffery/表示每一行的結尾添加jeffery字元串
13.#sed -e ཇ,53d' -e 's/wang/pan/' example.file
(-e)選項允許在同一行里執行多條命令。如例子所示,第一條命令刪除11至53行,第二條命令用pan替換wang。命令的執行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。(參數d,表示刪除指定的行)
14.# sed --expression='s/wang/pan/' --expression='/love/d' example.file
一個比-e更好的命令是--expression。它能給sed表達式賦值。
15.#sed '/wangpan/r file' example.file
file里的內容被讀進來,顯示在與wangpan匹配的行後面,如果匹配多行,則file的內容將顯示在所有匹配行的下面。參數r,表示讀出文件,後面空格緊跟文件名稱
16.# sed -n '/test/w file' example.file
在example.file中所有包含test的行都被寫入file里。參數w,表示將匹配的行寫入到指定的文件file中
17.sed '/test/ioh! My god!' example.file
'oh! My god!'被追加到包含test字元串列的前面,參數i表示添加指定內容到匹配行的前面一行,sed要求參數i後面有一個反斜杠
18.#sed Ƈ,10y/abcde/ABCDE/' example.file
把1—10行內所有abcde轉變為大寫,注意,正則表達式元字元不能使用這個命令。參數y,表示把一個字元翻譯為另外的字元(但是不用於正則表達式)
19.#find . -name "*.log" -exec rm -f {} ;
查找當前目錄及子目錄里所有的文件,刪除文件名以log為後綴的文件 -exec可以對find出來的結果執行命令, {} ;代表find出來的結果,除了-name參數外,經常用的還有:
1)-mtime,-ctime,atime都是指按時間查找,-mtime是文件的修改時間,-ctime是文件的創建時間,atime是後找開文件時間;
2)-type 指定查找的文件的類型,它有d,l,b,p,f,c等文件類型,d是查找目錄,l是查找鏈接檔,b是查找塊文件,p是查找管道文件,f是普通文件,c是字元設備文件;
3)-perm 0700查許可權為700的文件或目錄;
4)-size +512k查大於512k的文件 ;-size -512k 查小於512k的文件;
5)-mtime +2 兩天以前修改過的文件; -mtime -2 兩天內修改過的文件;-atime -2 兩天內訪問過的文件;-ctime -2 兩天內創建的文件
② linux之文本內容替換命令sed
sed簡介:流編輯工具,用來對文本進行過濾與替換操作。
sed流程:sed通過一次僅讀取一行內容來對某些指令進行處理後輸出。
1、sed通過文件或管道讀取文件內容,但sed默認並不直接修改源文件,而是將讀入的內容復制到緩沖區中,稱之為模式空間。
2、所有的指令操作都是在模式空間找那個進行
3、sed根據相應的指令對模式空間中的內容進行處理並輸出結果,默認輸出至標准輸出(即屏幕上)。
sed基本語法格式:
用法:sed[選項]...{腳本指令}[輸入文件]...
選項: -version 顯示sed版本
-help :顯示幫助文檔
-n,-quiet,-silent靜默輸出,默認情況下,sed程序在所有的腳本指令執行完畢後,將自動列印模式空間中的內容。
-e script允許多個腳本指令被執行
-f script-file從文件中讀取腳本指令,對編寫自動化腳本程序很實用
-i ,-in-place 該選項直接修改源文件
-l N 該選項指定l指令可以輸出的行長度,l指令為輸出非列印字元。
-posix 禁用GNU sed擴展功能。
-r 在腳本指令中使用擴展正則表達式。
-s,-separate 默認情況下,sed將把輸入的多個文件名作為一個長的連續的輸入流。而GNU sed則允許把它們當作單獨的文件。
-u,-unbuffered 最低限度的緩存輸入與輸出
a,append表示追加指令;
i,insert表示插入指令;
d,delete表示刪除指令;
s,substitution表示替換指令。
sed腳本指令的基本格式是:
[地址,即路徑]命令(有些命令僅可以對一行操作,有些可以對多行操作),命令也可以用花括弧進行組合,使命令序列可以作用於同一個地址。
address{
command1
command2
command3
}
sed的基本工作方式是:
sed的替換命令s:
1、全局替換 : s/old/new/g ,其中g為全局替換,用於替換所有出現的次數; /如果和正則匹配的內容沖突可以使用其他符號,如 : s@old@new@g
2、標志位
為什麼要有多行模式: 配置文件一般有單行出現,但也有使用json或XML格式的配置文件,為多行出現。
多行模式處理命令N、D、P
③ 一句話解釋,sed命令是做什麼的
命令:
a\在當前行後面加入一行文本。
b label分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。
c\用新的文本改變本行的文本。
d 從模板塊位置刪除行。
D 刪除模板塊的第一行。
i\在當前行上面插入文本。
h拷貝模板塊的內容到內存中的緩沖區。
H 追加模板塊的內容到內存中的緩沖區。
g 獲得內存緩沖區的內容,並替代當前模板塊中的文本。
G 獲得內存緩沖區的內容,並追加到當前模板塊文本的後面。
l 列表不能列印字元的清單。
n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
N 追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼。
p 列印模板塊的行。
P 列印模板塊的第一行。
q 退出Sed。
r file從file中讀行。
t labelif分支,從最後一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
T label錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
w file寫並追加模板塊到file末尾。
W file寫並追加模板塊的第一行到file末尾。
④ Linux sed 命令詳解
sed命令行格式:sed [options] 'command' file(s)
options常用選項:
-n或--quiet或——silent:僅顯示script處理後的結果;
-e:以選項中的指定的script來處理輸入的文本文件;
-f:以選項中指定的script文件來處理輸入的文本文件;
-r∶sed 的動作支援的是延伸型正規表示法的語法;
-i∶直接修改讀取的檔案內容,而不是由螢幕輸出;
-h或--help:顯示幫助;
-V或--version:顯示版本信息。
Command常用命令:
a:新增,a 的後面可以接字元串,而這些字元串會在新的一行出現(目前的下一行);
c:取代,c 的後面可以接字元串,這些字元串可以取代 n1,n2 之間的行;
d:刪除,d 後面通常不接任何字元串;
i:插入,i 的後面可以接字元串,而這些字元串會在新的一行出現(目前的上一行);
p:列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作;
s:取代,可以直接進行取代的工作,通常與正規表達式搭配使用。
實例說明:
新增操作:a命令
sed '/^bird/a\test' file將test追加到 以bird開頭的行後面
刪除操作:d命令
sed '/^$/d' file #刪除空白行;
sed '2d' file #刪除第二行;
sed '2,$d' file #刪除第2行到最後一行;
sed '$d' file #刪除最後一行;
sed '/^bird/'d file #刪除所有開頭是bird的行;
插入操作:i命令
sed -i '3i\bird ' bird.conf #在bird.conf文件第3行之前插入bird
替換文本中的字元串:s命令
sed 's/bird/birds/' file #將文本中的bird替換成birds;
sed -i 's/ bird / birds /g' file #將file文件中每一行的第一個bird替換為birds;