【Linux】 三大編輯神器 - sed (上集)
首页 专栏 linux 文章详情
0

【Linux】 三大編輯神器 - sed (上集)

Simon Gan 发布于 5 月 15 日

本文介紹三大編輯神器之一 - sed

0.工作原理
1.所有參數以及意義
2.不同的數字表達不同的意思
3.優勢與劣勢

語法格式:
sed [options] [sed-commands] [input-file]
sed 選項 sed 命令 輸入文件

[options]
-n 僅返回結果列
-i 修改文件

[sed-commands]
p 常與-n 搭配使用,打印結果
a 增加,增加到當前行(數字)後面
i 插入,當前行(數字)插入
c 按行替換
s 替換整個文本

工作原理:
sed = Stream Editor (數據流編輯器)
通過管道輸入讀入每一行的數據,將數據村存儲到一個臨時模式空間(緩存),判斷每一行是否需要執行,執行命令后,清空空間,再將下一行的數據存儲並處理。

增加
在第二行增加1條記錄

sed '2a 102 shanghai' test.txt

在第二行增加多條記錄增加

# 方法一 sed '2a 102 shanghai\ > 103 guangzhou > 104 beijing' test.txt # 方法二 sed '2a 102 shanghai\n103 guangzhou\n104 beijing' test.txt

注意:
-a 增加,是對該行後面增加; 2a = 第三行
-i 追加,是對該行增加; 2i = 第二行

刪除
選項並對應的效果

10{sed-commands} 第10行 10,20{sed-commands} 第10到20行 10,+20{sed-commands} 第10到10+20第(30)行 10,${sed-commands} 第10到最後一行,正則$代表結尾 1^2{sed-commands} 以1開頭,相差2的等差數列 /guangzhou/,+20 以匹配到guangzhou為開始,往後加20行 /guangzhou/,/shanghai/ 以匹配第一個guangzhou為開始,以匹配到第一個shanghai為結束

替換(c=change,不常用)

簡單實例:
對test.txt中的第2到第5行替換
用法和刪除基本無異

sed '2,5c 102 beijing\n103 shanghai' test.txt

替換(s 常用)

-c 與 -s 直接的區別
-c 是按行替換 -s 對文本替換

語法:

1)sed 's/被替換的/替換成的/g' test.txt 2)sed 's#被替換的#替換成的#g' test.txt

應用場景1:
將test.txt 文件中的beijing,替換成wuhan(常量)

sed 's/beijing/wuhan/g' test.tst

應用場景2:
將變量a替換成變量b,外面要添加""雙引號

cat >> t1.txt << EOF a a b EOF a=1 b=2 echo $a,$b sed "s/$a/$b/g" t1.txt

應用場景3:
分組替換
最多可以同時處理9個括號,後面加\1\2...\9

#固定寫法 sed \(\) \1# sed \(\)(\)(\) \1\2\3# #正則 ^作爲開頭,$作爲結尾,\1 針對第一個括號進行替換 echo I am science desinger. | sed 's#^.*am \([a-z].*\) tea.*$#\1#g' #輸出science

應用場景4:
優化開機啓動項

列出所有開機啓動項 -> chkconfig --list 截取要關閉的選項,並添加 off -> 中間一連串操作 bash 執行 -> bash

補充: -r 擴展正則表達式,可直接用(),無需\進行轉義。

chkconfig --list|grep 3:on | grep -vE "network|cround|sysstat" | awk '{print $1}' | sed -r 's#(.*)#chkconfig \1 off#g'|bash

應用場景5:
& 代表被切換變量
(適用於被替換后添加更多的字符串)
將1到3行數字101.102.103中的0替換成--0--

sed s/0/--&--/g test.txt sed s#0#--&--#g test.txt

查詢
-n 僅返回查詢結果,通常與p print打印一起使用

應用場景1:
返回第2到最後一行的數據

sed -n '2,$p' test.txt
linux
阅读 34 发布于 5 月 15 日
收藏
分享
本作品系原创, 采用《署名-非商业性使用-禁止演绎 4.0 国际》许可协议
大数据工程师养成记
关注专栏
avatar
Simon Gan
15 声望
5 粉丝
关注作者
0 条评论
得票数 最新
提交评论
你知道吗?

注册登录
avatar
Simon Gan
15 声望
5 粉丝
关注作者
宣传栏
目录

本文介紹三大編輯神器之一 - sed

0.工作原理
1.所有參數以及意義
2.不同的數字表達不同的意思
3.優勢與劣勢

語法格式:
sed [options] [sed-commands] [input-file]
sed 選項 sed 命令 輸入文件

[options]
-n 僅返回結果列
-i 修改文件

[sed-commands]
p 常與-n 搭配使用,打印結果
a 增加,增加到當前行(數字)後面
i 插入,當前行(數字)插入
c 按行替換
s 替換整個文本

工作原理:
sed = Stream Editor (數據流編輯器)
通過管道輸入讀入每一行的數據,將數據村存儲到一個臨時模式空間(緩存),判斷每一行是否需要執行,執行命令后,清空空間,再將下一行的數據存儲並處理。

增加
在第二行增加1條記錄

sed '2a 102 shanghai' test.txt

在第二行增加多條記錄增加

# 方法一 sed '2a 102 shanghai\ > 103 guangzhou > 104 beijing' test.txt # 方法二 sed '2a 102 shanghai\n103 guangzhou\n104 beijing' test.txt

注意:
-a 增加,是對該行後面增加; 2a = 第三行
-i 追加,是對該行增加; 2i = 第二行

刪除
選項並對應的效果

10{sed-commands} 第10行 10,20{sed-commands} 第10到20行 10,+20{sed-commands} 第10到10+20第(30)行 10,${sed-commands} 第10到最後一行,正則$代表結尾 1^2{sed-commands} 以1開頭,相差2的等差數列 /guangzhou/,+20 以匹配到guangzhou為開始,往後加20行 /guangzhou/,/shanghai/ 以匹配第一個guangzhou為開始,以匹配到第一個shanghai為結束

替換(c=change,不常用)

簡單實例:
對test.txt中的第2到第5行替換
用法和刪除基本無異

sed '2,5c 102 beijing\n103 shanghai' test.txt

替換(s 常用)

-c 與 -s 直接的區別
-c 是按行替換 -s 對文本替換

語法:

1)sed 's/被替換的/替換成的/g' test.txt 2)sed 's#被替換的#替換成的#g' test.txt

應用場景1:
將test.txt 文件中的beijing,替換成wuhan(常量)

sed 's/beijing/wuhan/g' test.tst

應用場景2:
將變量a替換成變量b,外面要添加""雙引號

cat >> t1.txt << EOF a a b EOF a=1 b=2 echo $a,$b sed "s/$a/$b/g" t1.txt

應用場景3:
分組替換
最多可以同時處理9個括號,後面加\1\2...\9

#固定寫法 sed \(\) \1# sed \(\)(\)(\) \1\2\3# #正則 ^作爲開頭,$作爲結尾,\1 針對第一個括號進行替換 echo I am science desinger. | sed 's#^.*am \([a-z].*\) tea.*$#\1#g' #輸出science

應用場景4:
優化開機啓動項

列出所有開機啓動項 -> chkconfig --list 截取要關閉的選項,並添加 off -> 中間一連串操作 bash 執行 -> bash

補充: -r 擴展正則表達式,可直接用(),無需\進行轉義。

chkconfig --list|grep 3:on | grep -vE "network|cround|sysstat" | awk '{print $1}' | sed -r 's#(.*)#chkconfig \1 off#g'|bash

應用場景5:
& 代表被切換變量
(適用於被替換后添加更多的字符串)
將1到3行數字101.102.103中的0替換成--0--

sed s/0/--&--/g test.txt sed s#0#--&--#g test.txt

查詢
-n 僅返回查詢結果,通常與p print打印一起使用

應用場景1:
返回第2到最後一行的數據

sed -n '2,$p' test.txt