Sed-useful-recipes

提供:Dev Guides
移動先:案内検索

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

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