前篇回顧
sed - 簡介 讀取編輯文字檔的好工具
sed - 2 Pattern
今天來聊一下sed的編輯功能, 畢竟sed是Stream Editor;
主要command功能就還是新增, 刪除, 修改, 輸出
新增, 大概能想的到
刪除
修改
先聊刪除功能, 因為就一個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
^$
, ^表示begin of a line, $表示end of the linecat > os.txt <<EOF
> Windows OS os!
> Linux Os os
>
> Android
>
> OS
> EOF
sed '/^$/d' os.txt
> Windows OS OS!
> Linux OS OS!
> Android
> OS
nl os.txt | sed '/Linux/,+2d'
> 1 Windows
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
Windows OS os
這裡2個OS之間是個tab# 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