ストリームエディタ-正規表現
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
単一文字(。)
ドット(。)は、行末文字を除く任意の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
専用セット([^])
排他的セットでは、キャレットは角括弧内の文字のセットを無効にします。次の例では、「ボール」のみを出力します。
[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
次に、範囲を「AP」に変更して、結果を観察します。
[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'
上記のコードを実行すると、次の結果が得られます。
Call
Ball
1回の発生でゼロ(\?)
SEDでは、疑問符(\?)は、前の文字の0回または1回の出現に一致します。次の例は、「Behaviour」と「Behavior」に一致します。ここでは、「\?」を使用してオプション文字として「u」を作成しました。
[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'
上記のコードを実行すると、次の結果が得られます。
Behaviour
Behavior
1つ以上の発生(\ +)
SEDでは、プラス記号(\ +)は、前の文字の1つ以上のオカレンスと一致します。次の例は、「2」の1つ以上のオカレンスに一致します。
[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から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
[:lower:]
小文字のみを意味します。次の例は「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スタイルの正規表現です。メタ文字のサポートはGNUSED固有であり、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