Sed是一個行編輯器,通常一次只處理一行數據,默認不編輯原文件,而是把原來的數據複製一份到內存中執行編輯操作,可以對行進行刪除,增加,替換,選取等特性功能。
工具原理:
Sed讀取文件的內容放到內存中,我們通常稱作爲模式空間,sed會通過正則表達式匹配模式空間中符合條件的行,匹配到的行會進行編輯操作,有可能會輸出到頻幕上,這得看你的編輯操作了,原本讀取到的行默認會輸出到頻幕上,你可以不讓它輸出,sed會一直從第一行讀取到最後一行。
Sed還有段空間,被稱爲保持空間,當你讀取行文件到模式空間,模式空間會把讀取到的行文件保存到保持空間,我們還可以實現模式空間和保持空間的對換編輯。
Sed指令:
元字符 | 功能 | 示例 | 示例的匹配對象 |
^ | 行首定位符 | /^love/ | 匹配所有以love開頭的行 |
$ | 行尾定位符 | /love$/ | 匹配所有以love結尾的行 |
. | 匹配除換行符外的單個字符 | /l..e/ | 匹配包含字母l後跟兩個任意字符在跟字母e的行 |
* | 匹配零個或多個前導字符 | /*love/ | 匹配在零個或多個空格緊跟着模式love的行 |
[] | 匹配指定字符組內的任一字符 | /[Ll]ove/ | 匹配包含love和Love的行 |
[^] | 匹配不在指定字符組內的任一字符 | /[^A-KM-Z]ove/ | 匹配包含ove,但ove之前的那個字符不在A至K或M至Z之間的行 |
\(..\) | 保存已匹配的字符 | s/\(love\)able/\1er/ | 標記元字符之間的模式,並將其保存爲標籤1,之後可以用好\1來引用它。最多可定義9個標籤,從左邊開始編號,最左邊的是第一個。在這個示例中,loe被保存在寄存器1裏,之後被替換串引用,結果loveable被替換爲lover。 |
& | 保存查找串以便在替換串中引用 | s/love/**&**/ | 符號&代表查找串。字符串love將替換前後各加了兩個星號的引用,即love變成**love** |
\< | 詞首定位符 | /\<love/ | 匹配包含以love開頭的單詞的行 |
\> | 詞尾定位符 | /love/>/ | 匹配包含以love結尾的單詞的行 |
x\{m\} | 連續m個x | /o\{5\}/ | 分別匹配出現連續5個字母o、至少5個連續的o、或5-10個連續的o的行 |
x\{m,\} | 至少m個x | /o\{5,\}/ | |
X\{m,n\} | 至少m個但不超過n個x | /o\{5,10\}/ |
常用選項:
-n:不輸出模式空間中的內容至屏幕;
-e :多點編輯;
-f /PATH/TO/SED_SCRIPT_FILE:指定sed腳本
注意:sed腳本後邊不能有空格
-r, --regexp-extended:支持使用擴展正則表達式;
-i[SUFFIX], --in-place[=SUFFIX]:編輯的結果保存到原文件中
地址定界:
(1) 空地址:默認是對全文進行處理;
(2) 單地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;
(3) 地址範圍
#,#:匹配兩者之間的內容帶其本身
#,+#:匹配從本行往後的#行
#,/pat1/:匹配本行到匹配到的字符的行
/pat1/,/pat2/:匹配兩字符串之間的內容,包括本身
$:最後一行;
(4) 步進:~
1~2:所有奇數行
2~2:所有偶數行
編輯命令:
d:刪除;
上面刪除第一行
p:顯示模式空間中的內容;
顯示第一行
a \text:在行後面追加文本“text”,支持使用\n實現多行追加;
i \text:在行前面插入文本“text”,支持使用\n實現多行插入;
c \text:把匹配到的行替換爲此處指定的文本“text”;
w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行後面;文件合併;
=:爲模式匹配到的行打印行號;
!:條件取反;
地址定界!編輯命令;
s///:查找替換,其分隔符可自行指定,常用的有s@@@, s###等;
替換標記:
g:全局替換;
w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
p:顯示替換成功的行;