GNU sed是一款文本流編輯器(stream editor),USEFUL ONE-LINE SCRIPTS FOR SED中提供了2種方案用以實現文本行的倒置(最後一行變成第一行,依次類推,功能類似於tac)。分別是sed '1!G;h;$!d'sed -n '1!G;h;$p',二者本質上是一樣的。本文主要討論前一種操作的實現過程。

Command Explanation

sed的官方文件見 sed, a stream editor,命令

1
sed '1!G;h;$!d'

中使用到的指令定義如下

  1. G: append hold space to pattern space
  2. h: copy pattern space to hold space
  3. d: delete pattern space. start next cycle.

!表是取反,;用於分隔操作,順序執行。

Divided Process

構建文件/tmp/sed.txt,內容如下

1
2
3
4
a
b
c
d

分解過程如下

pattern hold pattern hold pattern hold pattern hold
1!G 1!G h h $!d $!d
a a a a a
b a b\na a b\na b\na b\na
c b\na c\nb\na b\na c\nb\na c\nb\na c\nb\na
d c\nb\na d\nc\nb\na c\nb\na d\nc\nb\na d\nc\nb\na d\nc\nb\na d\nc\nb\na

完整解釋:

  1. 對第一行之外的所有數據行,將當前讀取行的 hold space 中內容追加到 pattern space 中;
  2. 將當前讀取行的 pattern space 中內容複製到 hold space 中;
  3. 除了最後一行,清空其餘的數據行的 pattern space
  4. 到最後一行時,輸出 pattern space 中內容。

實例演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[email protected]:~$ cat /tmp/sed.txt
a
b
c
d
[email protected]:~$ sed = /tmp/sed.txt | sed 'N;[email protected]\[email protected] @'
1 a
2 b
3 c
4 d
[email protected]:~$ sed '1!G;h;$!d' /tmp/sed.txt
d
c
b
a
[email protected]:~$ sed -n '1!G;h;$p' /tmp/sed.txt
d
c
b
a
[email protected]:~$

Bibliography

Change Logs

  • 2017.06.15 11:27 Thu Asia/Shanghai
    • 初稿完成