Linux|常用命令|sed

SED的適用場景

SED是Stream EDitor的簡稱,也就是流編輯器,適用在不打開文件的情況下,增刪改查文件內容
SED command in UNIX stands for stream editor and it can perform lots of functions on file like searching, substitution or find and replace, insertion or deletion.By using SED you can edit files even without opening them, which is much quicker way to find and replace something in file, than first opening that file in VI Editor and then changing it.

語法格式

#第一種語法格式
STDOUT | sed [option] <command>

#第二種語法格式
sed [option] <command> <file>
sed [option] <command> <<EOF
EOF

command使用雙引號包裹,變數生效
command使用單引號包裹,單引號包裹變數後生效
command建議使用單引號包裹,避免非變數生效,如sed '$d'sed "$d"

== <[area] action>

Option

參數說明

-n #常和p搭配
-e #-e <command> -e <command>
-f #讀取文件中的<command>
-i #更新文件(默認是輸出到STDOUT)
-r #使用擴展正則表達式,建議使用,語法便利

命令的執行順序對結果有影響
sed -e <command> -e <commmand> $file
sed 'command;command' $file
sed <command> $file | sed <command> $file

Action作用的行範圍

範圍 示例
預設默認所有行
n1 command 第n行
$ command 尾行
n1,n2 command 第n1~n2行
n1,+n 第n1~n1+n行
/ptn1/ command 所有匹配到的行
/ptn1/,/ptn2/ command ptn=ptn1,匹配則區間開始,ptn=ptn2,匹配則區間結束,閉區間,反覆執行
/ptn1/,+n command 匹配ptn1即隨後n行,反覆執行
n1,/ptn2/ command 從n1行到匹配ptn2的閉區間,以及後續匹配ptn2的所有行
/ptn1/,n2 command 從匹配ptn1到n2行的閉區間,以及後續匹配ptn1的所有行

Action類型:行的增刪改查

p print
i insert
a append
r read
w write
c
s
y
d

#目標行後新增行
sed -r '[area] a <line content>' $file
#目標行前新增行
sed -r '[area] i <line content>' $file
#目標行後新增多行,方式一,單引號包裹command
sed -r '[area] a <line content>\
<line content>\
<line content>' $file
#目標行後新增多行,方式二,雙引號包裹command
sed -r "[area] a <line content>\n<line content>\n<line content>" $file
#複製目標行
sed -r "[area] p" $file

sed -r '[area] d' 

#定界符,定界符出現在樣式內部時,需要進行轉義
echo -e … | sed -r '[area] s/origin/new/' $file
echo -e … | sed -r '[area] s|origin|new|' $file
echo -e … | sed -r '[area] s:origin:new:' $file

#每行只替換第一個匹配的字元串
echo -e … | sed -r '[area] s/origin/new/' $file
echo -e … | sed -r '[area] s/origin/new/1' $file

#每行替換所有匹配的字元串
echo -e … | sed -r '[area] s/origin/new/g' $file

#每行替換第n個及後續匹配的字元串
echo -e … | sed -r '[area] s/origin/new/ng' $file

#匹配忽略大小寫
echo -e … | sed -r '[area] s/origin/new/ngi' $file

#匹配和反向引用,&代表匹配的部分
sed -r '[area] s/pattern/prefix&/g' $file #目標字元串前添加字元串
sed -r '[area] s/pattern/&postfix/g' $file #目標字元串後添加字元串
sed -r '[area] s/^/prefix&/g' $file #在所有行首添加
sed -r '[area] s/$/&postfix/g' $file #在所有行末添加
#分組(匹配的一部分)和反向引用
sed -rn '[area] s/.*(ptn1).*(ptn2).*/\1\2/ p' $file
#分組(匹配的一部分)和反向引用,提取字元串
sed -rn '[area] s/.*(ptn1).*/\1/ p' $file

#將多行替換成一行
sed '[area] c new line' $file

sed -rn '[area] p' $file 

正則Regular Expression

推薦使用擴展語法sed -r ...,統一的規範。

擴展 默認 效果
\?
* *
+ \+
{n1} \{n1\}
{n1,n2} \{n1,n2\}
{n1,} \{n1,\}
^ ^
$ $
[] []
[^] [^]
[a-zA-Z0-9] [a-zA-Z0-9]
\w \w 字母數字下劃線
\W \W 字母數字下劃線
\s \s
\S \S
() \(\)