iT邦幫忙

2021 iThome 鐵人賽

DAY 11
1
Software Development

系統與服務雜談系列 第 11

sed - 3 Delete command

前篇回顧
sed - 簡介 讀取編輯文字檔的好工具
sed - 2 Pattern

今天來聊一下sed的編輯功能, 畢竟sed是Stream Editor;
主要command功能就還是新增, 刪除, 修改, 輸出

新增, 大概能想的到

  • a(append) 在匹配行後面新增
  • i(insert) 在匹配行前面新增
  • r(append from file) 讀取外部文件, 在匹配行後面新增
  • w(write the current pattern space to file) 從pattern space把匹配行訊息給寫到外部文件的尾巴

刪除

  • d (delete)

修改

  • c 把匹配行換成新的文本內容
  • s 取代指定匹配到的字串, 變成新字串

先聊刪除功能, 因為就一個delete
s也能作到類似刪除的功能, 之後再說

刪除

重要

首先拿/etc/passwd來玩, 但是我們玩備份的這檔案, 別玩etc底下的, 玩完系統就崩潰了

# 複製passwd 到當前目錄
cp /etc/passwd ./
  • 刪除指定行數
# 指定第1行做刪除
nl passwd | sed '1d'
>     2	daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
>     3	bin:x:2:2:bin:/bin:/usr/sbin/nologin

但再看一次passwd內容, 原本的第一行root還是在

nl passwd 
>     1	root:x:0:0:root:/root:/bin/bash
>     2	daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin****

複習一下sed預設不改變原始文件, 只改變pattern space的內容
這裡要直接改變原文件要加上-i(edit file in place)

sed -i '1d' passwd

前一篇介紹的一些行定位方法, 這裡都能用
也能搭配字串匹配的方式做操作.

更多刪除案例

準備資料

cat > os.txt <<EOF
> Windows
> Linux
> Android
> OS
> EOF
  • 刪除匹配到的行
nl os.txt | sed '/OS/d' 
>     1	Windows
>     2	Linux
>     3	Android
  • 刪除空白行
    空白行, 在Regex內會用^$, ^表示begin of a line, $表示end of the line
    中間我們都沒寫任何東西, 就表示這行啥都沒有, 空的.
cat > os.txt <<EOF
> Windows OS os!
> Linux Os os
> 
> Android
> 
> OS
> EOF

sed '/^$/d' os.txt     
> Windows	OS OS!
> Linux OS OS!
> Android
> OS
  • 刪除匹配到的行, 跟和往後的2行
nl os.txt | sed '/Linux/,+2d' 
>     1	Windows
  • 刪除一行內重複出現2次匹配字串的行
    準備資料
cat > os.txt <<EOF
> Windows OS os!
> Linux Os os
> Android
> OS
> EOF

直覺想法, 把一行內匹配到第二次的給換成指定字串;
然後在一次sed, 把匹配到指定字串的給刪除
2則表示匹配到的第二個

sed 's/OS/del/2' os.txt    | sed '/del/d'
Android
OS
# os.txt
> Windows OS      os 
> Linux Os os
> Android
> OS
> EOF

cat -T os.txt 
# 可以看到^I就是了tab
> Windows OS^Ios
> Linux Os os
> Android
> OS

想法是把行內有不滿足可以[:print:]的都刪除, 跟上面案例的^有所不同
這裡的是用到Regex的[^...], 在中括號內, 表示匹配指定字元之外的任何內容
[^[:print:]]

sed '/[^[:print:]]/d' os.txt
> Linux Os os
> Android
> OS

----參考來源
Negated Character Classes


上一篇
sed - 2 Pattern
下一篇
sed - 4 Write commands
系列文
系統與服務雜談30

尚未有邦友留言

立即登入留言