ストリームエディタ-便利なレシピ

SEDは、問題を解決するための複数の方法を可能にする素晴らしいユーティリティです。これはUNIXの方法であり、SEDはそれを完全に証明しています。GNU / Linuxは、日常のタスクを実行するための多くの便利なユーティリティを提供します。SEDを使用していくつかのユーティリティをシミュレートしてみましょう。簡単な問題を難しい方法で解決しているように見えることもありますが、その目的はSEDの力を示すことだけです。

猫コマンド

次の例では、各行がデフォルトのワークフローの一部として印刷されています。

[jerry]$ sed '' books.txt

上記のコードを実行すると、次の結果が得られます。

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

次の例では、printコマンドを使用してファイルの内容を表示します。

[jerry]$ sed -n 'p' books.txt

上記のコードを実行すると、次の結果が得られます。

A Storm of Swords, George R. R. Martin 
The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho 
A Game of Thrones, George R. R. Martin

空の行を削除する

次の例では、「^ $」は空の行を意味し、パターン一致が成功すると空の行が削除されます。

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'

上記のコードを実行すると、次の結果が得られます。

Line #1 
Line #2

同様に、次の例では、空でない場合にのみ行を出力します。

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'

上記のコードを実行すると、次の結果が得られます。

Line #1 
Line #2

C ++プログラムからのコメント行の削除

サンプルのC ++プログラムを作成しましょう。

#include <iostream> 
using namespace std; 

int main(void) 
{ 
   // Displays message on stdout. 
   cout >> "Hello, World !!!" >> endl;  
   return 0; // Return success. 
}

次に、次の正規表現を使用してコメントを削除します。

[jerry]$ sed 's|//.*||g' hello.cpp

上記のコードを実行すると、次の結果が得られます。

#include <iostream>
using namespace std; 

int main(void) 
{ 
   cout >> "Hello, World !!!" >> endl; 
   return 0;  
}

特定の行の前にコメントを追加する

次の例では、行番号3〜5の前にコメントを追加します。

[jerry]$ sed '3,5 s/^/#/' hello.sh

上記のコードを実行すると、次の結果が得られます。

#!/bin/bash 
#pwd 
#hostname 
#uname -a 
who 
who -r 
lsb_release -a

Wc-lコマンド

「wc-l」コマンドは、ファイルに存在する行数をカウントします。次のSED式は同じことをシミュレートします。

[jerry]$ sed -n '$ =' hello.sh

上記のコードを実行すると、次の結果が得られます。

8

ヘッドコマンド

デフォルトでは、headコマンドはファイルの最初の10行を出力します。SEDで同じ動作をシミュレートしてみましょう。

[jerry]$ sed '10 q' books.txt

上記のコードを実行すると、次の結果が得られます。

A Storm of Swords 
George R. R. Martin 
The Two Towers 
J. R. R. Tolkien 
The Alchemist 
Paulo Coelho 
The Fellowship of the Ring 
J. R. R. Tolkien 
The Pilgrimage
Paulo Coelho

テール-1コマンド

「tail-1」はファイルの最後の行を出力します。次の構文は、そのシミュレーションを示しています。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat test.txt

上記のコードを実行すると、次の結果が得られます。

Line #1 
Line #2

SEDスクリプトを書いてみましょう。

[jerry]$ sed -n '$p' test.txt

上記のコードを実行すると、次の結果が得られます。

Line #2

Dos2unixコマンド

DOS環境では、改行はCR / LF文字の組み合わせで表されます。次の「dos2unix」コマンドのシミュレーションは、DOSの改行文字をUNIXの改行文字に変換します。GNU / Linuxでは、この文字は「^ M」(コントロールM)文字として扱われることがよくあります。

[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt 
[jerry]$ file test.txt

上記のコードを実行すると、次の結果が得られます。

test.txt: ASCII text, with CRLF line terminators

SEDを使用してコマンドをシミュレートしてみましょう。

[jerry]$ sed 's/^M$//' test.txt > new.txt   # Press "ctrl+v" followed "ctrl+m" to generate 
"^M" character. 
[jerry]$ file new.txt

上記のコードを実行すると、次の結果が得られます。

new.txt: ASCII text

次に、ファイルの内容を表示します。

[jerry]$ cat -vte new.txt

上記のコードを実行すると、次の結果が得られます。

Line #1$ 
Line #2$

Unix2dosコマンド

「dos2unix」と同様に、UNIXの改行文字をDOSの改行文字に変換する「unix2dos」コマンドがあります。次の例は、同じもののシミュレーションを示しています。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ file test.txt

上記のコードを実行すると、次の結果が得られます。

test.txt: ASCII text

SEDを使用してコマンドをシミュレートしてみましょう。

[jerry]$ sed 's/$/\r/' test.txt  > new.txt 
[jerry]$ file new.txt

上記のコードを実行すると、次の結果が得られます。

new.txt: ASCII text, with CRLF line terminators

次に、ファイルの内容を表示します。

Now let us display the file contents.

上記のコードを実行すると、次の結果が得られます。

Line #1^M$ 
Line #2^M$

Cat-Eコマンド

「cat-E」コマンドは、行末をドル($)文字で表示します。次のSEDの例は、同じもののシミュレーションです。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat -E test.txt

上記のコードを実行すると、次の結果が得られます。

Line #1$ 
Line #2$

SEDを使用してコマンドをシミュレートしてみましょう。

[jerry]$ sed 's|$|&$|' test.txt

上記のコードを実行すると、次の結果が得られます。

Line #1$ 
Line #2$

Cat-ETコマンド

「cat-ET」コマンドは、各行の終わりにドル($)記号を表示し、TAB文字を「^ I」として表示します。次の例は、SEDを使用した「cat-ET」コマンドのシミュレーションを示しています。

[jerry]$ echo -e "Line #1\tLine #2" > test.txt 
[jerry]$ cat -ET test.txt

上記のコードを実行すると、次の結果が得られます。

Line #1^ILine #2$

SEDを使用してコマンドをシミュレートしてみましょう。

[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'

上記のコードを実行すると、次の結果が得られます。

Line #1^ILine #2$

nlコマンド

「nl」コマンドは、単にファイルの行に番号を付けます。次のSEDスクリプトは、この動作をシミュレートします。

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'

上記のコードを実行すると、次の結果が得られます。

1 Line #1 
2 Line #2

最初のSED式は、行番号の後にその内容を出力し、2番目のSED式は、これら2つの行をマージして、改行文字をTAB文字に変換します。

cpコマンド

「cp」コマンドは、ファイルの別のコピーを作成します。次のSEDスクリプトは、この動作をシミュレートします。

[jerry]$ sed -n 'w dup.txt' data.txt 
[jerry]$ diff data.txt dup.txt 
[jerry]$ echo $?

上記のコードを実行すると、次の結果が得られます。

0

コマンドの展開

「expand」コマンドは、TAB文字を空白に変換します。次のコードは、そのシミュレーションを示しています。

[jerry]$ echo -e "One\tTwo\tThree" > test.txt 
[jerry]$ expand test.txt > expand.txt 
[jerry]$ sed 's/\t/     /g' test.txt > new.txt 
[jerry]$ diff new.txt expand.txt  
[jerry]$ echo $?

上記のコードを実行すると、次の結果が得られます。

0

ティーコマンド

「tee」コマンドは、データをファイルだけでなく標準出力ストリームにもダンプします。以下に、「tee」コマンドのシミュレーションを示します。

[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt  
Line #1 
Line #2

SEDを使用してコマンドをシミュレートしてみましょう。

[jerry]$ sed -n 'p; w new.txt' test.txt

上記のコードを実行すると、次の結果が得られます。

Line #1 
Line #2

cat-sコマンド

UNIXの「cat-s」コマンドは、繰り返される空の出力行を抑制します。次のコードは、「cat-s」コマンドのシミュレーションを示しています。

[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt  
[jerry]$ cat -s test.txt

上記のコードを実行すると、次の結果が得られます。

Line #1  
Line #2
Line #3

SEDを使用してコマンドをシミュレートしてみましょう。

[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt

上記のコードを実行すると、次の結果が得られます。

Line #1  
Line #2  
Line #3

grepコマンド

デフォルトでは、「grep」コマンドは、パターンマッチングが成功したときに行を出力します。次のコードは、そのシミュレーションを示しています。

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep "Line #1" test.txt

上記のコードを実行すると、次の結果が得られます。

Line #1

SEDを使用してコマンドをシミュレートしてみましょう。

[jerry]$ sed -n '/Line #1/p' test.txt

上記のコードを実行すると、次の結果が得られます。

Line #1

grep-vコマンド

デフォルトでは、「grep -v」コマンドは、パターンマッチングが失敗したときに行を出力します。次のコードは、そのシミュレーションを示しています。

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep -v "Line #1" test.txt

上記のコードを実行すると、次の結果が得られます。

Line #2 
Line #3

SEDを使用してコマンドをシミュレートしてみましょう。

[jerry]$ sed -n '/Line #1/!p' test.txt

上記のコードを実行すると、次の結果が得られます。

Line #2 
Line #3

trコマンド

「tr」コマンドは文字を変換します。以下にそのシミュレーションを示します。

[jerry]$ echo "ABC" | tr "ABC" "abc"

上記のコードを実行すると、次の結果が得られます。

abc

SEDを使用してコマンドをシミュレートしてみましょう。

[jerry]$ echo "ABC" | sed 'y/ABC/abc/'

上記のコードを実行すると、次の結果が得られます。

abc