bash 使用sed命令

2022-05-01 11:18:07 字數 4255 閱讀 1188

sed (流文字編輯器)

用法:sed options... [script] [inputfile...]

-r: 使用擴充套件的正規表示式;

-n, --quiet, --silent: 不輸出模式空間的內容;

-e: -e '' -e '' -e ''

'cmd1;cmd2;cmd3

'# sed -e '

1d' -e '

2p' /etc/fstab

# sed

'1d;2p'/etc/fstab #同時執行多條命令

-f /path/to/sed_script:從指定的檔案讀取處理指令碼

sed 工作流程

工作流程:把文字中第一行讀取到模式空間(記憶體)--在模式空間內進行編輯(script)--輸出編輯後的內容--清空模式空間(再迴圈到第一步)

#

(行號): 指定行

$: 最後一行

/regexp/:任何能夠被regexp匹配到的行 #

sed '/dev/d' /etc/fstab #刪除匹配到dev的行

\%regexp%: 任何能夠被regexp匹配到的行;換用%為邊界符號;#

邊界匹配可以換成@,#等,但必須是\@開頭和@結尾

/regexp/i #

sed '/dev/id' /etc/fstab

\%regexp%i:匹配時忽略字元大小寫;

addr1, addr2: 指定範圍內的所有行:

1·,/regexp/

#(行號),#(行號)

/regexp/,/regexp/

#(行號),+# :假如#=2,則+#等於加後面2行 # sed '2,+2d' /etc/fstab,刪除第2行開始,到第4行匹配到的內容

first~step:指定起始位置,以及步長 1~3 #

sed '1~2d' /etc/fstab

基本正規表示式元字元:

字元:.    [^]

次數:*, \+, \?, \

分組:\(\)

錨定:^, $, \<, \>或者:\|後向引用:\1, \2, ...

注意:命令之前可以使用!表示取反操作;

=: 顯示行號

#d: 刪除匹配到的行;

p: 列印模式空間中的內容;

通常與-n選項一同使用;

#sed -n '3,5p' /etc/fstab #輸出第3到5行,如果不加-n引數,第3到5行會列印2遍

sed '1a \test' /etc/fstab

a \text1\ntext2\ntext3: 附加多行文字

i \text:insert,

i \text1\ntext2: 插入多行文字

c \text: change,把匹配到的行替換為給定的文字

#sed '3c \mmmm' /etc/fstab #把檔案第3行替換成mmmm,一整行替換

s///: 替換命令

g: 全域性替換

i: 不區分大小寫

#sed 's/dev/etc/g' /etc/fstab #將檔案中dev替換為etc

例項:

1 刪除/boot/grub/grub.conf檔案中所以空白開頭的行行首的空白

#sed 's/^[[:space:]]\+//g' /boot/grub/grub.conf

2 刪除/etc/fstab檔案中所有以#

開頭,後跟至少乙個空白字元的行的行首的#和空白字元

#sed 's/^#[[:space:]]\+//' /etc/fstab

3echo乙個檔案路徑給sed命令,取出其基名;取出其目錄名

#echo "/etc/sysconfig/" | sed 's@[^/]\/\?$@@g'

4 替換/etc/inittab檔案「id:數字:initdefault:」一行中的那個數字為6

#sed 's@id:[0-9]:initdefault:@id:6:initdefault@' /etc/inittab

h: 用模式空間中的內容覆蓋保持空間中的內容;

h:把模式空間中的內容追求至保持空間;

g: get, 從保持空間取回資料至模式空間,覆蓋模式空間中原有的內容;

g:get, 從保持空間取回資料至模式空間,追加於模式空間中現有的內容後面;

x: 把模式空間和保持空間中的內容進行交換;

n: 讀取匹配到的行下一行至模式空間;

n: 追加讀匹配到的行下一行至模式空間;

d: 刪除模式空間中的內容;

d:刪除多行模式空間中首行;

sed '1!g;h;$!d' file

#解釋:取檔案第一行,第一行不執行g命令(其他行要執行g命令);執行h命令;最後一行不執行d命令(不是最後一行都要執行d命令),迴圈每一行

顯示檔案的偶數行:

[root@iscsi ~]#

cat aa

aabb

ccdd

mm命令:sed -n 'n;p' file; 或者 sed -n '2~2p' file

[root@iscsi ~]#

sed -n 'n;p' aa

bbdd

[root@iscsi ~]#

sed -n '2~2p' aa

bbdd

顯示檔案的奇數行:

命令:sed -n 'p;n' file;     sed -n '1~2p' file

[root@iscsi ~]#

sed -n 'p;n' aa

aacc

mm[root@iscsi ~]#

sed -n '1~2p' aa

aacc

mm

運用 sed 命令高效地刪除檔案的特定行

注意:-i 表示直接進行檔案操作,而不在終端上顯示結果。

1刪除某一行 sed 'nd' file

#sed '1d' sed_test.ext

#sed '$d' sed_test.txt 刪除最後一行

2. 刪除某些行

#sed '5,7d' sed_test.txt #刪除5,6,7行

#sed '1d;5d;9d;$d' sed_test.txt #刪除不連續的行

#sed '3,6!d' sed_test.txt #刪除第 3到 6 行以外的其他行

3. 刪除空白行

#sed '/^$/d' sed_test.txt #這裡兩個斜槓 / / 內的表示式起到了文字匹配的作用

4. 刪除包含特定字元的行

#sed '/system/d' sed_test.txt

#sed '/system\|linux/d' sed_test.txt #符號 \| 代表邏輯或,文字中有 system 或 linux 的行都要進行刪除。

5. 刪除特定字元開頭的行

#sed '/^r/d' sed_test.txt #刪除已r開頭的行

#sed '/^[rf]/d' sed_test.txt #刪除以 r 或者 f 開頭的行

6. 刪除特定字元結尾的行

#sed '/m$/d' #刪除以m結尾的行

#sed '/[xm]$/d' #刪除以x或m結尾的行

7. 刪除以大寫字母開頭的行

#sed '/^[a-z]/d'

8. 刪除包含字母字元的行

#sed '/[a-za-z]/d'

9. 刪除包含數字的行

#sed '/[0-9]/d'

#sed '1,6' #指定刪除在 1 到 6 行內有 linux 這個詞的內容

#sed '/system/' #刪除包含 system 以及其下一行的內容

練習:說明以下sed命令的意義:

(1) sed '$!n;$!d' /etc/issue

(2) sed '$!d' /etc/issue #

最後一行不執行刪除命令,即刪除最後一行之前的行

(3) sed 'g' /etc/issue #

每行後面加空白行

(4) sed '/^$/d;g' /etc/issue

(5) sed 'n;d' /etc/issue #

刪除偶數行

(6) sed -n '1!g;h;$p' /etc/issue

sed命令使用

sed命令使用 常用選項 n 使用安靜模式,在一般情況所有的 stdin 都會輸出到螢幕上,加入 n 後只列印被 sed 特殊處理的行 e 多重編輯,且命令順序會影響結果 f 指定乙個 sed 指令碼檔案到命令列執行,r sed 使用擴充套件正則 i 直接修改文件讀取的內容,不在螢幕上輸出 sed操...

sed命令使用

常用選項 n 使用安靜模式,在一般情況所有的 stdin 都會輸出到螢幕上,加入 n 後只列印被 sed 特殊處理的行 e 多重編輯,且命令順序會影響結果 f 指定乙個 sed 指令碼檔案到命令列執行,r sed 使用擴充套件正則 i 直接修改文件讀取的內容,不在螢幕上輸出 sed操作命令 sed ...

BASH學習筆記 sed

可以通過定址來定位你所希望編輯的行,該位址用數字構成,用逗號分隔的兩個行數表示以這兩行為起止的行的範圍 包括行數表示的那兩行 如1,3表示1,2,3行,美元符號 表示最後一行。範圍可以通過資料,正規表示式或者二者結合的方式確定。呼叫sed命令有兩種形式 a 在當前行後面加入一行文字。b lable ...