sed知识整理
sed命令格式
sed [options] 'command' file(s) sed [options] -f scriptfile file(s) ./sedscript file(s)選項
| -n | 只打印模式匹配的行(默認(rèn)會打印所有行) |
| -e | 直接在命令行模式上進(jìn)行sed動作編輯,此為默認(rèn)選項 |
| -f | 將sed的動作寫在一個文件內(nèi),用–f filename 執(zhí)行filename內(nèi)的sed動作 |
| -r | 支持?jǐn)U展表達(dá)式 |
| -i | 直接修改文件內(nèi)容 |
命令部分
sed命令有2部分組成:
- 文本定位
- 編輯命令
文本定位
| x | x為一行號,如1 |
| x,y | 表示行號范圍從x到y(tǒng),如2,5表示從第2行到第5行 |
| /pattern/ | 查詢包含模式的行。例如/disk/或/[a-z]/。當(dāng)此模式作為范圍時,行號為匹配的第一行。 |
| /pattern/pattern/ | 查詢包含兩個模式的行。例如/disk/disks/ |
| /pattern/,x | 在給定行號上查詢包含模式的行。如/ribbon/,3 |
| x,/pattern/ | 通過行號和模式查詢匹配行。3./vdu/ |
| x,y! | 查詢不包含指定行號x和y的行。1,2! |
編輯命令
| p | 打印匹配行 |
| = | 顯示文件行號 |
| a | 在定位行號后附加新文本信息 |
| i | 在定位行號后前插入新文本信息 |
| d | 刪除定位行 |
| c | 用新文本替換定位文本 |
| s | 使用替換模式替換相應(yīng)模式 |
| r | 從另一個文件中讀文本 |
| w | 寫文本到一個文件 |
| q | 第一個模式匹配完成后推出或立即推出 |
| l | 顯示與八進(jìn)制A S C I I代碼等價的控制字符 |
| { } | 在定位行執(zhí)行的命令組 |
| n | 從另一個文件中讀文本下一行,并附加在下一行 |
| N | 在數(shù)據(jù)流中添加下一行以創(chuàng)建用于處理的多行組 |
| g | 將模式2粘貼到/pattern n/ |
| y | 傳送字符 |
| n | 延續(xù)到下一輸入行;允許跨行的模式匹配語句 |
正則表達(dá)式
擴(kuò)展正則表達(dá)式(必須結(jié)合-r選項)
| ^ | 錨點行首的符合條件的內(nèi)容,用法格式"^pattern" |
| $ | 錨點行首的符合條件的內(nèi)容,用法格式"pattern$" |
| ^$ | 空白行 |
| . | 匹配任意單個字符 |
| * | 匹配緊挨在前面的字符任意次(0,1,多次) |
| .* | 匹配任意長度的任意字符 |
| \? | 匹配緊挨在前面的字符0次或1次 |
| {m,n} | 匹配其前面的字符至少m次,至多n次 |
| {m,} | 匹配其前面的字符至少m次 |
| {m} | 精確匹配前面的m次{0,n}:0到n次 |
| < | 錨點詞首----相當(dāng)于 \b,用法格式:<pattern |
| \> | 錨點詞尾,用法格式:>pattern |
| \< pattern \> | 單詞錨點 |
| ( ) | 分組,用法格式:pattern,引用\1,\2 |
| [] | 匹配指定范圍內(nèi)的任意單個字符 |
| [^] | 匹配指定范圍外的任意單個字符 |
| [:digit:] | 所有數(shù)字, 相當(dāng)于0-9, [0-9]—> [[:digit:]] |
| [:lower:] | 所有的小寫字母 |
| [:upper:] | 所有的大寫字母 |
| [:alpha:] | 所有的字母 |
| [:alnum:] | 相當(dāng)于0-9a-zA-Z |
| [:space:] | 空白字符 |
| [:punct:] | 所有標(biāo)點符號 |
示例
sed -n '2p' file.txt //打印第二行 sed -n '1,4p' file.txt //print 1-4 line sed -n '1,$p' file.txt //print allsed -n '/require/'p cart.php /匹配require sed -n '/$/'p cart.php /匹配$特殊字符 要用 sed -n '/.*uire/'p cart.php sed -n -e '/require/p' -e '/require/=' cart.php //匹配require 并且打印行號 sed -n '/require/=' cart.php //只打印匹配的行號注意
處理單引號
把test內(nèi)容中單引號替換成雙引號 sed 's/'"'"/'"''/g' test ==> sed 's/' " ' " / ' " ' '/g' test 解析下: 's/' => 要進(jìn)行替換操作,后緊跟匹配字符 "'" => 用雙引號包裹著單引號 / =>分割符 '"' => 用單引號包裹著雙引號 '/g' =>分隔符,全局替換當(dāng)然還可以使用下面這兩種方法替換: sed s#\'#\"#g test 最外層使用#分隔,里面使用轉(zhuǎn)義單引號,轉(zhuǎn)義雙引號 sed "s/'/\"/g" test 最外層使用雙引號,里面使用單引號,轉(zhuǎn)義雙引號echo "mmm'sss" | sed 's/'"'"/'"''/g' echo "mmm'sss" | sed s#\'#\"#g echo "mmm'sss" | sed "s/'/\"/g"替換
'word/s/^/Li/g' #匹配word的行,并在行首加Li 's/linux/jie &/g' #匹配linux,在linux前加 jie #\1 \2 表示匹配的分組,&表示,匹配的內(nèi)容(匹配表達(dá)式的部分,不是整行) #s的分界符,可以是/,#,$等,可以指定Suse系統(tǒng)中,特殊情況
沒有研究過其他系統(tǒng),在Suse系統(tǒng)中,sed的{m,n},(),+等元字符,不能加\,不然就會出錯。
反引號(`),不需要加\。
替換的變量不能有換行符,
處理掉換行符語句:
通過/pattern1/,/pattern2/定位多行,開始行號為pattern1匹配的第1行,結(jié)束行號為pattern2的第一行,所以通過這種方式過濾閉區(qū)間的范圍會出錯。
如果2個模式中的有一個沒有匹配上,則不會匹配任何行。
總結(jié)
- 上一篇: sed模式空间(pattern spac
- 下一篇: sed知识整理:模式空间