ストリームエディタ-便利なレシピ
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