sed 命令使用及示例
阿新 • • 發佈:2019-12-31
sed
是一個用來篩選與轉換文字內容的工具。一般用來批量替換,刪除某行檔案
- 原文連結: sed命令使用及示例 · github
- 系列文章: 當我有臺伺服器時我做了什麼 · github
sed 命令詳解
每個 sed 命令,基本可以由選項,匹配與對應的操作來完成
# 列印檔案第三行到第五行
# -n: 選項,代表列印
# 3-5: 匹配,代表第三行到第五行
# p: 操作,代表列印
$ sed -n '3,5p' file
# 刪除檔案第二行
# -i: 選項,代表直接替換檔案
# 2: 匹配,代表第二行
# d: 操作,代表刪除
$ sed -i '2d' file
複製程式碼
選項
-n
: 列印匹配內容行
-i
: 直接替換文字內容
-f
: 指定 sed 指令碼檔案,包含一系列 sed 命令
匹配
-
/reg/
: 匹配正則 -
3
: 數字代表第幾行 -
$
: 最後一行 -
1,3
: 第一行到第三行 -
1,+3
: 第一行,並再往下列印三行 (列印第一行到第四行) -
1,/reg/
第一行,併到匹配字序列
操作
-
a
: append,下一行插入內容 -
i
: insert,上一行插入內容 -
p
: print,列印,通常用來列印檔案某幾行,通常與-n
一起用 -
s
: replace,替換,與 vim 一致
sed examples
檢視手冊
$ man sed
複製程式碼
列印特定行
p
指列印
# 1p 指列印第一行
$ ps -ef | sed -n 1p
UID PID PPID C STIME TTY TIME CMD
# 2,5p 指列印第2-5行
$ ps -ef | sed -n 2,5p
root 1 0 0 Sep29 ? 00:03:42 /usr/lib/systemd/systemd --system --deserialize 15
root 2 0 0 Sep29 ? 00:00:00 [kthreadd]
root 3 2 0 Sep29 ? 00:00:51 [ksoftirqd/0]
root 5 2 0 Sep29 ? 00:00:00 [kworker/0:0H]
複製程式碼
列印最後一行
$
指最後一行
注意需要使用單引號
$ ps -ef | sed -n '$p'
複製程式碼
刪除特定行
d
指刪除
$ cat hello.txt
hello,one
hello,two
hello,three
# 刪除第三行內容
$ sed '3d' hello.txt
hello,two
複製程式碼
過濾字串
與 grep
類似,不過 grep
可以高亮關鍵詞
$ ps -ef | sed -n /ssh/p
root 1188 1 0 Sep29 ? 00:00:00 /usr/sbin/sshd -D
root 9291 1188 0 20:00 ? 00:00:00 sshd: root@pts/0
root 9687 1188 0 20:02 ? 00:00:00 sshd: root@pts/2
root 11502 9689 0 20:08 pts/2 00:00:00 sed -n /ssh/p
root 14766 1 0 Sep30 ? 00:00:00 ssh-agent -s
$ ps -ef | grep ssh
root 1188 1 0 Sep29 ? 00:00:00 /usr/sbin/sshd -D
root 9291 1188 0 20:00 ? 00:00:00 sshd: root@pts/0
root 9687 1188 0 20:02 ? 00:00:00 sshd: root@pts/2
root 12200 9689 0 20:10 pts/2 00:00:00 grep --color=auto ssh
root 14766 1 0 Sep30 ? 00:00:00 ssh-agent -s
複製程式碼
刪除匹配字串的行
$ cat hello.txt
hello,three
$ sed /one/d hello.txt
hello,three
複製程式碼
替換內容
s
代表替換,與 vim 類似
$ echo hello | sed s/hello/world/
world
複製程式碼
新增內容
a
與 i
代表在新一行新增內容,與 vim 類似
# i 指定前一行
# a 指定後一行
# -e 指定指令碼
$ echo hello | sed -e '/hello/i hello insert' -e '/hello/a hello append'
hello insert
hello
hello append
複製程式碼
替換檔案內容
$ cat hello.txt
hello,world
hello,world
# 把 hello 替換成 world
$ sed -i s/hello/world/g hello.txt
$ cat hello.txt
world,world
world,world
複製程式碼
注意事項
如果想在 mac 中使用 sed
,請使用 gsed
替代,不然在正則或者某些格式上擴充套件不全。
使用 brew install gnu-sed
安裝
$ echo "hello" | sed "s/\bhello\b/world/g"
hello
$ brew install gnu-sed
$ echo "hello" | gsed "s/\bhello\b/world/g"
world
複製程式碼