歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux sed 流編輯器的一些應用實例

Linux sed 流編輯器的一些應用實例

日期:2017/2/28 15:54:02   编辑:Linux教程

1. 首先注意sed的作用是什麼?本質是什麼?本質就是自動的編輯器!也就是在腳本代碼

中進行控制的!使編輯文件的過程自動化,以便用“批處理”方式編輯文件
2. sed是基於行的,因此按順序對每一行執行命令。
3. 參數
sed: invalidoption -- h
用法: sed[選項]... {腳本(如果沒有其他腳本)} [輸入文件]...

-n, --quiet,--silent
取消自動打印模式空間
也就是所有的顯示都是由自己控制的!!!
-e 腳本,--expression=腳本
添加“腳本”到程序的運行列表
-f 腳本文件,--file=腳本文件
添加“腳本文件”到程序的運行列表
-i[擴展名],--in-place[=擴展名]
直接修改文件(如果指定擴展名就備份文件)
-l N,--line-length=N
指定“l”命令的換行期望長度
--posix
關閉所有 GNU 擴展
-r,--regexp-extended
在腳本中使用擴展正則表達式
-s,--separate
將輸入文件視為各個獨立的文件而不是一個長的連續輸入
-u,--unbuffered
從輸入文件讀取最少的數據,更頻繁的刷新輸出
--help 打印幫助並退出
--version 輸出版本信息並退出

如果沒有 -e,--expression, -f 或 --file 選項,那麼第一個非選項參數被視為
sed腳本。其他非選項參數被視為輸入文件,如果沒有輸入文件,那麼程序將從標准
輸入讀取數據。

4. sed -e'1,10d' ping.sh >1
# 將ping.sh中逐行讀取到緩沖區,刪除ping.sh文件中1-10行,然後重定向到1文件中

5. sed -e'/^#/d' ping.sh > 1
#將ping.sh中逐行讀取到緩沖區,刪除ping.sh文件中第一個字符是#的行,然後重定向到
1文件中

6. sed -e'/"/d' ping.sh > 1
# 刪除有 "的行,並輸出到1文件

7. 字符 描述
^ 與行首匹配
$ 與行末尾匹配
\w 與任一個字符匹配
* 將與 前一個字符的零或多個出現匹配
[] 與 [ ] 之內的所有字符匹配

8. 下面是幾個示例:
規則表達式 描述
/./ 將與包含至少一個字符的任何行匹配
---> 也就是說只要有一個字符的行都會輸出

/../ 將與包含至少兩個字符的任何行匹配
---> 也就是說只要有兩個字符在一起及以上的都會刪除

/^#/ 將與以 '#'開始的任何行匹配
---> 匹配開頭( ^ ) 以#的行刪除

/^$/ 將與所有空行匹配
---> 也就是開頭結尾沒有東西,所以就是空行刪除
---> sed -e '/^$/d' ping.sh | wc -l >1 將非空行的函數輸入到文件1( 刪除空行,剩下
的結果輸出到文件 )

/}$/ 將與以'}'(無空格)結束的任何行匹配
---> sed -e '/}$/d' ping.sh >1 以 }結束的行

/}*^/ 將與以 '}' 後面跟有零或多個空格結束的任何行匹配

/[abc]/ 將與包含小寫'a'、'b' 或 'c'的任何行匹配
---> sed -e '/[a-z]/d' ping.sh >1 將有a-z字母的行都去掉

/^[abc]/ 將與以 'a'、'b'或 'c'開始的任何行匹配
---> sed -e '/[a-z]/d' ping.sh >1 將開頭是a-z的行都刪除


9. sed -n -e'/{/,/}/p' ping.sh >1
----> 注意這是輸出命令(p),是輸出{}之間的內容
請注意新的 '-n'選項,該選項告訴 sed 除非明確要求打印模式空間,否則不這樣做。
您還會注意到,我們用'p' 命令替換了 'd' 命令,如您所猜想的那樣,這明確要求 sed
打印模式空間。就這樣,將只打印匹配部分。

10. sed -n -e'/judge[[:space:]]*(/, /^}/p' ping.sh>1
----> 輸出judge函數的所有內容

11. 如何使用 sed來執行字符串替換、創建更大的 sed 腳本以及如何使用 sed 的附加、插
入和更改行命令。

12. 替換:
sed -e's/echo/oche/' ping.sh > 1
----> s前綴就是替換命令,就是將ping.sh中出現的echo替換為oche
----> 同時注意:只替換每行第一次出現的哦~
----> 請注意:這條命令沒有改變源文件中的內容,而下面的就是可以的

sed -e's/echo/oche/g' ping.sh >1
----> 將所有的出現的都替換 ( 全局替換吧 )


我們需要知道的是,s/// 是一個命令哦,是不可分割的呗~所以我們可以與其他的命
令一起使用!
sed -e '1,10s/echo/ohce/g' ping.sh > 1
----> 也就是只處理1-10行( 包括1和10 )
注意:我們要知道的是:1和10指定的行結束,我們也可使用特殊的字符串結束!如
下:
sed -e '/^$/, /^}/s/echo/ohce/g' ping.sh > 1
----> 由空行開始執行,直到遇到 } 開始的行結束

注意:我們並沒有硬性規定一定是s、/組合,這只是常規的用法,當然也可以使用別的
字符,例如
sed -e 's:echo:ooo:g' ping.sh >1 也是可以的哦~
但是一般在替換的字符串中有/才用這樣的方法
例如:
sed -e 's:pt/ss.ps:pt/ss:g' ping.sh > 1


13. sed -e's/<.*>//g' ping.sh >1
---->將<>形式替換成空格!注意其中有一個 ' . ',所以最少是一個字符哦~

但是你自己運行一下,這是你需要的結果嗎?!!!!
顯然不是不是嗎?
在我的測試代碼中的內容是:
# pt/ss/ps <> <> <> <sdjsdvb> <...> <yyyy>
# <z>

那我本來想留下的結果是:
# pt/ss/ps
#
但是很不幸的是結果是:
# pt/ss/ps
這就是s///的處理機制不一樣呗~!那麼他會尋找最長的字符串,我們需要怎麼作
呢!?
sed -e's/<[^>]*>//g' ping.sh > 1
中間是>的後面不處理
注意:有一些shell是不支持的!

14.
注意下面代碼的不同:
對於處理這樣一行:<yjasbhdcjsd> <a>
sed -e's/<[a-z]>//g' ping.sh>1 #注意此處只是匹配一個字符而已

sed -e's/<[a-z]*>//g' ping.sh>1 #此處匹配以字符開頭的多個字符


15.
這將匹配零或多個全部為'a'、'b'、'c'...'v'、'w'、'x' 的字符。另外,可以使用
'[:space:]'字符類來匹配
空格。以下是可用字符類的相當完整的列表:
字符類 描述
[:alnum:] 字母數字 [a-zA-Z 0-9]
[:alpha:] 字母 [a-zA-Z]
[:blank:] 空格或制表鍵
[:cntrl:] 任何控制字符
[:digit:] 數字[0-9]
[:graph:] 任何可視字符(無空格)
[:lower:] 小寫[a-z]
[:print:] 非控制字符
[:punct:] 標點字符
[:space:] 空格
[:upper:] 大寫[A-Z]
[:xdigit:] 十六進制數字 [0-9a-fA-F]


16. 高級替換功能
我們現在想在所有的行前面加上MM,那麼怎麼處理呢?是所有的行哦~
sed -e's/.*/MM: &/g' ping.sh >1
----> 就是 & 符號處理

Copyright © Linux教程網 All Rights Reserved