sed命令小記

junwind發表於2021-04-30
sed  將內容一行行載入到記憶體空間,處理,然後再列印到螢幕; 預設是不修改原始檔的
sed -niefr 'line action 修飾符' file ...
    -n 靜默模式 , 只列印處理的行
    -i 直接修改原始檔
    -e script -e script 
    -f sed_script 
    -r  使用egrep
line 
    1,100
    5 
    $
    $-1
    1,+21行開始,向後的2行,即1~3/regexp/, /regexp/   
action 
    d   
    p   
    a \str   
    i \str   
    r file 
    w file 
    s/regexp/str/
        sed '1,$s/oot/OOT/' file  如果行範圍是1,$即全文,則可省略 sed 's@oot@OOT@' file 
        &  引用匹配到的整個字串
        後向引用  \( \)  \1  \2 
修飾符  gi

示例:

sed '3,$d' file   刪除
sed '1,+2d' file 
sed '/oot/d' file   刪除匹配到的行
sed '/^\//d' file   刪除以 / 開頭的行

sed -n '/^\//p' file  列印

sed '/^\//a \# hello world\n# hello linux' file  追加

sed '$r /etc/issue' file   讀入
sed '1,2r /etc/issue' file 

sed '/oot/w /tmp/oot.txt' file   寫出

sed 's@l..e@&r@g' file 
sed 's@\(l..e\)@\1r@g' file 
history | sed 's#^[[:space:]]*##g' | cut -d' ' -f1

練習:

1. 給定一個路徑,取出父目錄?
    echo /etc/profile.d/run.sh | sed -r 's@(/.*/)[a-z._0-9A-Z]+/?@\1@'
    echo /etc/profile.d/run_sh | sed -r 's@(/.*/)([a-z._0-9A-Z]+)/?@\2@'
    dirname   basename  

2. 刪除/etc/grub.conf檔案中行首的空白符
    sed -r 's@^[[:space:]]+@@g' sedfile

3. 替換/etc/inittab檔案中"id:3:initdefault:"一行中的數字為5
    sed -r 's@(id:)[0-9](:[a-zA-Z]+:)@\15\2@' sedfile

4. 刪除/etc/inittab檔案中的空白行

5. 刪除/etc/inittab檔案中開頭的#號

6. 刪除某檔案中開頭的#號及後面的空白字元,但要求#號後面必須有空白字元

7. 匹配某檔案中以空白字元後跟#的行, 並刪除開頭的空白符及# ?
本作品採用《CC 協議》,轉載必須註明作者和本文連結
六月的風

相關文章