Sed-regular-expressions

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

ストリームエディター-正規表現

SEDを強力かつ効率的にするのは正規表現です。 正規表現を使用すると、多くの複雑なタスクを解決できます。 コマンドラインのエキスパートなら誰でも、正規表現の力を知っています。

他の多くのGNU/Linuxユーティリティと同様に、SEDも正規表現をサポートしています。これは regex と呼ばれることもあります。 この章では、正規表現について詳しく説明します。 この章は、標準正規表現、正規表現のPOSIXクラス、およびメタ文字の3つのセクションに分かれています。

標準正規表現

行頭(^)

正規表現の用語では、キャレット(^)記号は行の先頭に一致します。 次の例では、パターン「The」で始まるすべての行を印刷します。

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

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

The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho

行末($)

行の終わりは、ドル($)記号で表されます。 次の例は、「Coelho」で終わる行を出力します。

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

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

The Alchemist, Paulo Coelho
The Pilgrimage, Paulo Coelho

単一文字(。)

Dot(。)は、行末文字を除く任意の1文字と一致します。 次の例は、文字「t」で終わる3文字の単語すべてを印刷します。

[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'

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

cat
bat
rat
mat

文字セットに一致([])

正規表現の用語では、文字セットは角括弧([])で表されます。 これは、複数の文字のうち1つだけを照合するために使用されます。 次の例は、パターン「Call」および「Tall」に一致しますが、「Ball」には一致しません。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/p'

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

Call
Tall

排他セット([^])

排他的セットでは、キャレットは角括弧内の文字セットを無効にします。 次の例では、「Ball」のみが出力されます。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/p'

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

Ball

文字範囲([-])

文字範囲が指定されている場合、正規表現は角括弧で指定された範囲内の任意の文字と一致します。 次の例では、「Call」と「Tall」は一致しますが、「Ball」は一致しません。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/p'

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

Call
Tall

次に、範囲を「A-P」に変更し、結果を観察しましょう。

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/p'

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

Call
Ball

ゼロオンワンオカレンス(\?)

SEDでは、疑問符(\?)は、直前の文字の0回または1回の出現に一致します。 次の例は、「Behaviour」と「Behavior」に一致します。 ここでは、「\?」を使用して、オプション文字として「u」を作成しました。

[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/p'

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

Behaviour
Behavior

1つ以上のオカレンス(\ +)

SEDでは、プラス記号(\ +)は、直前の文字の1つ以上の出現と一致します。 次の例は、1つ以上の「2」の出現に一致します。

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/p'

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

22
123
234
222

ゼロ以上の発生(*)

アスタリスク(*)は、直前の文字の0回以上の出現と一致します。 次の例は、「ca」、「cat」、「catt」などに一致します。

[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/p'

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

ca
cat

正確にN個の発生\ {n}

\ {n}は、直前の文字の「n」回の出現と完全に一致します。 次の例では、3桁の数字のみを出力します。 ただし、その前に、数字のみを含む次のファイルを作成する必要があります。

[jerry]$ cat numbers.txt

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

1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000

SED式を記述しましょう。

[jerry]$ sed -n '/^[0-9]\{3\}$/p' numbers.txt

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

100

中括弧のペアは、「\」文字によってエスケープされることに注意してください。

少なくともn個のオカレンス\ {n、}

\ {n、}は、少なくとも「n」個の先行文字に一致します。 次の例は、5桁以上のすべての数値を出力します。

[jerry]$ sed -n '/^[0-9]\{5,\}$/p' numbers.txt

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

10000
100000
1000000
10000000
100000000
1000000000

M to Nオカレンス\ {m、n}

\ {m、n}は、少なくとも「m」、最大で「n」個の先行文字に一致します。 次の例は、5桁以上で8桁以下のすべての数値を出力します。

[jerry]$ sed -n '/^[0-9]\{5,8\}$/p' numbers.txt

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

10000
100000
1000000
10000000

パイプ(|)

SEDでは、パイプ文字は論理OR演算のように動作します。 パイプの両側のアイテムに一致します。 次の例は、「str1」または「str3」のいずれかに一致します。

[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/p'

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

str1
str3

括弧とパイプ(|)のペアは「\」文字でエスケープされることに注意してください。

エスケープ文字

特定の特殊文字があります。 たとえば、改行は「\ n」で表され、キャリッジリターンは「\ r」で表されます。 これらの文字を通常のASCIIコンテキストに使用するには、バックスラッシュ(\)文字を使用してエスケープする必要があります。 この章では、特殊文字のエスケープについて説明します。

「\」のエスケープ

次の例は、パターン「\」に一致します。

[jerry]$ echo 'str1\str2' | sed -n '/\\/p'

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

str1\str2

「\ n」のエスケープ

次の例は、改行文字に一致します。

[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/p'

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

str1\nstr2

「\ r」のエスケープ

次の例は、キャリッジリターンに一致します。

[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/p'

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

str1\rstr2

「\ dnnn」のエスケープ

これは、10進数のASCII値が「nnn」である文字に一致します。 次の例は、文字「a」のみに一致します。

[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/p'

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

a

「\ onnn」のエスケープ

これは、8進数のASCII値が「nnn」である文字に一致します。 次の例は、文字「b」のみに一致します。

[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/p'

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

b

これは、16進数のASCII値が「nnn」である文字に一致します。 次の例は、文字「c」のみに一致します。

[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/p'

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

c

正規表現のPOSIXクラス

特別な意味を持つ特定の予約語があります。 これらの予約語は、正規表現のPOSIXクラスと呼ばれます。 このセクションでは、SEDでサポートされるPOSIXクラスについて説明します。

[:alnum:]

アルファベットと数字を意味します。 次の例では、「One」と「123」のみが一致しますが、タブ文字は一致しません。

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/p'

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

One
123

[:アルファ:]

アルファベットのみを意味します。 次の例では、単語「One」のみに一致します。

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/p'

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

One

[:ブランク:]

これは、空白またはタブのいずれかの空白文字を意味します。 次の例は、タブ文字のみに一致します。

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/p' | cat -vte

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

^I$

コマンド「cat -vte」は、タブ文字(^ I)を表示するために使用されることに注意してください。

[:桁:]

10進数のみを意味します。 次の例では、数字「123」のみが一致します。

[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/p'

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

123

[:下:]

小文字のみを意味します。 次の例は、「1」のみに一致します。

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/p'

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

one

[:アッパー:]

大文字のみを意味します。 次の例は、「TWO」のみに一致します。

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/p'

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

TWO

[:punct:]

スペースまたは英数字以外の文字を含む句読点を意味します

[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/p'

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

One,Two

[:スペース:]

空白文字を意味します。 次の例はこれを示しています。

[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/p' | cat -vte

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

123^L^I$

メタキャラクター

従来の正規表現と同様に、SEDもメタキャラクターをサポートしています。 これらはPerlスタイルの正規表現です。 メタキャラクターのサポートはGNU SED固有であり、SEDの他のバリアントでは機能しない可能性があることに注意してください。 メタキャラクターについて詳しく説明します。

単語の境界(\ b)

正規表現の用語では、「\ b」は単語の境界に一致します。 たとえば、「\ bthe \ b」は「the」に一致しますが、「these」、「there」、「they」、「then」などには一致しません。 次の例はこれを示しています。

[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/p'

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

the

非単語境界(\ B)

正規表現の用語では、「\ B」は非単語境界に一致します。 たとえば、「the \ B」は「these」と「they」には一致しますが、「the」には一致しません。 次の例はこれを示しています。

[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/p'

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

these
they

単一の空白(\ s)

SEDでは、「\ s」は単一の空白文字を意味します。 次の例は「Line \ t1」に一致しますが、「Line1」には一致しません。

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/p'

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

Line 1

単一の非空白(\ S)

SEDでは、「\ S」は単一の空白文字を意味します。 次の例は「Line2」に一致しますが、「Line \ t1」には一致しません。

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/p'

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

Line2

単一の単語の文字(\ w)

SEDでは、「\ w」は単一の単語文字、つまりアルファベット文字、数字、およびアンダースコア(_)を意味します。 次の例はこれを示しています。

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/p'

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

One
123
1_2

単一の非単語文字(\ W)

SEDでは、「\ W」は「\ w」とまったく反対の単一の非単語文字を意味します。 次の例はこれを示しています。

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/p'

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

&;#

パターンスペースの始まり(\ `)

SEDでは、「\」はパターンスペースの始まりを意味します。 次の例では、単語「One」のみに一致します。

[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/p'

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

One