关于linux:Linux-三大編輯神器-sed-上集

27次阅读

共计 1633 个字符,预计需要花费 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:
優化開機啓動項

  1. 列出所有開機啓動項 -> chkconfig –list
  2. 截取要關閉的選項,並增加 off -> 中間一連串操作
  3. 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

正文完
 0