Linux正規表現とgrep/sed完全ガイド|基本正規表現 vs 拡張正規表現【LinuC 1.03.4】

LinuC対策

この記事はLinuC Level1 主題1.03.4「正規表現を使用したテキストファイルの検索」に対応した要点解説です。試験で問われる範囲に絞り、正規表現メタ文字・grepオプション・sedの置換と削除に必要な知識だけをまとめました。

📚 LinuC Level1 完全攻略マップ(全39サブ項目)へ戻る


目次

  1. この記事でできるようになること
  2. 正規表現のメタ文字(BREとEREの違い)
  3. 文字クラスと [A-Z] / [[:upper:]]
  4. grep / egrep / fgrep-E / -F
  5. grep の主要オプション
  6. sed の置換 s/old/new/flag
  7. sed の行削除
  8. 複数コマンド・スクリプトファイル
  9. よくある質問(FAQ)
  10. まとめ
  11. 模擬問題にチャレンジ(ランダム出題)

1. この記事でできるようになること

LinuC 主題1.03.4 の出題範囲のうち、本記事で押さえる要点:

  • ✅ メタ文字 .(任意1文字)/*(0回以上)/+(1回以上・ERE)/?(0か1回・ERE)/^$
  • ✅ BREとEREの違い(+ ? | ( ) はEREのみ、BREは\+ \? \| \( \)
  • [A-Z] と POSIX文字クラス [[:upper:]] (二重の角括弧が必要)
  • [^x](否定文字クラス)と [...] でのメタ文字リテラル化
  • grep / egrep(=grep -E)/ fgrep(=grep -F)の違いと | の扱い
  • grepオプション:-i / -v / -n / -c / -l / -L / -f / -E / -F
  • sed置換:s/old/new//g(全置換)、/1(n番目)、/i/I(大小無視)、&(マッチ参照)
  • sed削除:/^$/d(空行)//^#/d(コメント行)/1,3d(範囲)
  • ✅ 複数コマンド:-e重ね掛け・;連結・-fスクリプトファイル

2. 正規表現のメタ文字(BREとEREの違い)

正規表現は「文字列のパターン」を短い記号で表す記法です。Linuxでは基本正規表現(BRE)拡張正規表現(ERE)の2系統があり、grepはBRE、grep -EegrepはERE、grep -Ffgrepはメタ文字なしのリテラル扱いです。

2-1. BREとEREで共通のメタ文字

メタ文字 意味
. 任意の1文字(改行以外) a.cabc, a9c など
* 直前のパターンを0回以上の繰り返し(空文字もマッチ) a*
^ 行頭 ^a → aで始まる行
$ 行末 a$ → aで終わる行
[...] 文字クラス(いずれか1文字) [aeiou]
[^...] 否定文字クラス(いずれでもない1文字) [^b] → b以外の1文字
\c メタ文字をエスケープしてリテラル扱い \. → ピリオド自身

2-2. EREだけのメタ文字(BREでは\が必要)

メタ文字(ERE) 意味 BREでの書き方
+ 直前のパターンを1回以上 \+
? 直前のパターンを0回または1回{0,1}と同じ) \?
| OR(選択) \|
( ) グループ化 \( \)
{n,m} n〜m回の繰り返し \{n,m\}
⚠️ ?{0,1} は同じ意味
colou?rcolou{0,1}r はどちらも「color または colour」にマッチします。どちらもEREのメタ表記です。

2-3. 繰り返しメタ文字の挙動を実際に確認する

$ cat test.txt
b!
ba!
bu!
buu!
buuu!

# bu? = u が 0 または 1 回 + !
$ grep -E 'bu?!' test.txt
b!
bu!
buu!
buuu!     # bu! を含むので部分マッチ

# bu+ = u が 1 回以上 + !
$ grep -E 'bu+!' test.txt
bu!
buu!
buuu!

grep行全体が一致する必要はなく、行内のどこかに部分一致すればその行を出力します。buuu!の中にbu!が含まれるため、bu?!でもヒットします。

2-4. . は「任意1文字」なので存在を要求する

$ cat test.txt
123
1223
1233
12344
123445
0123499

# 1234 の後に任意1文字が続く行
$ grep '1234.' test.txt
12344
123445
0123499

1234.は「1234 のあとに何か1文字がある」を意味します。12312231233はそもそも1234を含まないので不一致、1234412344501234991234の後に文字があるのでヒットします。

2-5. 行全体の完全一致には ^...$

# 「123」という内容の行だけ
$ grep '^123$' file.txt

# 「1」「任意1文字」「3」の行(中身が「123」でも「1a3」でも一致)
$ grep '^1.3$' file.txt

3. 文字クラスと [A-Z] / [[:upper:]]

「大文字アルファベット1文字」のように文字の種類で指定したい場合は、範囲指定とPOSIX文字クラスの2通りがあります。

書き方 意味
[A-Z] 範囲指定で大文字1文字
[a-z] 範囲指定で小文字1文字
[0-9] 範囲指定で数字1文字
[[:upper:]] POSIX文字クラスで大文字1文字
[[:lower:]] POSIX文字クラスで小文字1文字
[[:digit:]] POSIX文字クラスで数字1文字
⚠️ POSIX文字クラスは二重の角括弧が必要
正しくは[[:upper:]][:upper:]だけだと:uperのいずれかの1文字を表す普通の文字クラスになってしまいます。「範囲指定の[A-Z]」と「二重括弧の[[:upper:]]」はどちらも同じ意味で使えます。

3-1. 「# を含む行」を探す書き方の比較

#はメタ文字ではないため、基本的にはそのまま書けばOK。[#]\#のようにリテラル化しても同じ結果になります。ただし^#は「#で始まる行」に限定され、.#は「行頭の#」を含めずに拾ってしまうので要件が変わります。

# どれも「#を含む行」を抽出
$ grep '#'   file.txt
$ grep '\#'  file.txt
$ grep '[#]' file.txt

# こちらは意味が違う
$ grep '^#' file.txt   # 行頭の # に限定
$ grep '.#' file.txt   # 行頭の # は拾えない

4. grep / egrep / fgrep-E / -F

コマンド 解釈 等価オプション
grep BRE(基本正規表現) (なし)
egrep ERE(拡張正規表現) grep -E
fgrep 固定文字列(メタ文字なし) grep -F

4-1. ORを書く4つの書き方

「PINGT または pingt を含む行」を抽出する場合、以下がすべて正しい書き方です。

$ grep -E 'PINGT|pingt' test.txt       # ERE の |
$ egrep 'PINGT|pingt' test.txt          # egrep は ERE
$ grep -i 'pingt' test.txt              # 大小無視で 1 パターンに統一
$ grep 'PINGT\|pingt' test.txt          # BRE では \| でエスケープ
⚠️ fgrep-F では | が効かない
fgrep 'PINGT|pingt' test.txt は、「PINGT|pingt」というパイプ記号を含む10文字の文字列を探します。ファイル内にその文字列が無ければ何も出力されません。ORとして機能するのはBREの\|またはEREの|だけです。

4-2. メタ文字を「文字そのもの」として探したい場合

.*という2文字のリテラル文字列(メタ文字としてではなく)を含む行を探すには、次の4通りが使えます。

$ grep -F '.*' test.txt         # -F で全部リテラル
$ fgrep '.*' test.txt           # fgrep = grep -F
$ grep '\.\*' test.txt          # BRE でエスケープ
$ grep -E '\.\*' test.txt       # ERE でエスケープ

# これは要件を満たさない(正規表現として「任意文字0個以上」= 全行マッチ)
$ grep '.*' test.txt

4-3. 通常のリテラル文字列なら全コマンドで同じ

検索対象がメタ文字を含まない通常文字列(例:PIN)なら、grepgrep -Fegrep・パイプ経由のどれを使っても同じ結果になります。

$ grep PIN test.txt
$ grep 'PIN' test.txt
$ grep -F PIN test.txt
$ egrep PIN test.txt
$ cat test.txt | grep PIN

5. grep の主要オプション

オプション 意味
-i 大文字小文字を区別しない(ignore case)
-v マッチしない行を表示(反転)
-n マッチ行の先頭に行番号を付ける
-c マッチした行数のみを表示(count)
-l マッチを含むファイル名のみを表示(小文字L)
-L マッチを含まないファイル名を表示(大文字L)
-f ファイル 検索パターンをファイルから読み込む(1行1パターン)
-E EREで解釈(egrep相当)
-F 固定文字列として解釈(fgrep相当)
⚠️ 似たオプションの取り違えに注意
-i(小文字)=大小無視/-I(大文字)=バイナリファイル無視。-l(小文字)=ヒットしたファイル名/-L(大文字)=ヒットしなかったファイル名。-f(小文字)=パターンファイル指定/-F(大文字)=固定文字列。いずれも大小で別機能です。

5-1. 「コメント行以外」を抽出する2通り

# 「#で始まる行」を反転除外
$ grep -v '^#' httpd.conf

# 行頭が「#以外の1文字」で始まる行
$ grep '^[^#]' httpd.conf

どちらも設定ファイルからコメント行を除いて読むときの定番です。

5-2. 「大文字を含まない行」だけ抽出する

# どちらも同じ結果
$ grep -v '[A-Z]' test.txt
$ grep -v -E '[[:upper:]]' test.txt

-vで「大文字を含む行を反転除外」すれば、「大文字を一切含まない行」だけが残ります。[A-Z]でも[[:upper:]]でも意味は同じです。


6. sed の置換 s/old/new/flag

sedは行単位でテキストを処理するストリームエディタです。最頻出は置換コマンド s/pattern/replacement/flag。フラグを付けないと各行の最初の1回だけ置換します。

フラグ 意味
(なし) 各行の最初の1回だけ置換
g 行内の全てを置換(global)
1, 2, … 行内のn番目のみ置換(数値フラグ)
i または I 大文字小文字を区別しない(GNU sed)

6-1. 最初の1回だけ置換する書き方

# 以下はどれも「各行の最初のpingtをhogeに」
$ sed 's/pingt/hoge/' test.txt
$ sed 's/pingt/hoge/1' test.txt        # 数値フラグ 1 = 最初
$ sed -e 's/pingt/hoge/' test.txt      # -e はスクリプト追加オプション

6-2. 行内全てを置換する書き方

# 行内すべての pingt を hoge に
$ sed 's/pingt/hoge/g' test.txt
$ sed -e 's/pingt/hoge/g' test.txt
⚠️ -g--global というコマンドオプションは存在しない
「全置換」を指示するのは置換コマンドの末尾フラグ g であり、コマンドラインオプションではありません。sed -gのような書き方は誤りです。

6-3. 置換文字列の &(マッチ参照)

replacementの中に&を書くと「マッチした文字列そのもの」を参照できます。マッチ部分を残したまま前後に文字を足したいときの定番です。

# 234 にマッチした部分を「1 + マッチ + 5」に → 12345
$ echo 0234 | sed 's/234/1&5/'
012345

# Book をマッチさせて「A + マッチ + .」に → A Book.
$ echo 'Book is great.' | sed 's/Book/A &./'
A Book. is great.

フラグを付けないs/Book/A &./は「各行の最初の1回」だけを置換するので、上の例では1回目のBookだけがA Book.に変換されます。


7. sed の行削除

削除コマンドdは、アドレス(行番号や正規表現)にマッチする行をバッファから消してから出力します。

書き方 意味
Nd N行目を削除
N,Md N〜M行目を削除(範囲指定)
/pattern/d patternにマッチする行を削除
/^$/d 空行を削除
/^#/d 行頭が「#」の行を削除
# 1〜3行目を削除
$ sed '1,3d' test.txt

# 空行を削除
$ sed '/^$/d' test.txt

# 行頭が # の行(コメント行)を削除 = grep -v '^#' と等価
$ sed '/^#/d' test.txt
⚠️ 範囲指定は N,M 形式のみ
1,3dは正しいですが、1-3d1..3d-d 1,3といった書き方はいずれも誤りです。

7-1. 「行頭の#だけ削除」と「行ごと削除」の違い

# 行ごと削除(= grep -v '^#' と同じ)
$ sed '/^#/d' file.txt

# 行頭の # だけを消す(行自体は残る)
$ sed 's/^#//' file.txt

試験では「コメント行を消したい」に対しs/^#//を選ばせる引っかけが出題されます。sは文字を置換するだけで行そのものは削除しません。


8. 複数コマンド・スクリプトファイル

複数の編集を一度に行うには、-eの重ね掛け、;での連結、または-fによる外部スクリプトファイル読み込みが使えます。パイプで繋ぐ方法も同等の結果になります。

# すべての a を A に、b を B に(; で連結)
$ sed 's/a/A/g; s/b/B/g' file.txt

# 同じ動作を -e 重ね掛けで
$ sed -e 's/a/A/g' -e 's/b/B/g' file.txt

# tr でも1対1文字変換なら同じ結果
$ tr 'ab' 'AB' < file.txt

# 「pingtをhogeに全置換」かつ「#で始まる行を削除」
$ sed -e '/^#/d' -e 's/pingt/hoge/g' test.txt
$ sed '/^#/d; s/pingt/hoge/g' test.txt
$ grep -v '^#' test.txt | sed 's/pingt/hoge/g'

# 外部スクリプトファイルを読み込む(-f)
$ sed -f editfile test.txt
⚠️ -e-f の役割を区別する
-eは「コマンドラインでスクリプトを追加」、-fは「スクリプトをファイルから読み込む」です。sed -ssed --scriptのようなオプションは存在しません。

9. よくある質問(FAQ)

Q. [A-Z][[:upper:]] はどう違う?

意味は同じで、「大文字1文字」を表します。違いは書き方だけで、POSIX文字クラスは必ず二重の角括弧で書く必要があります。[:upper:](括弧が1重)だと、コロンやu/p/e/rのいずれか1文字という別の意味になります。

Q. grepgrep -E のどちらを使えばいい?

パターンに+ ? | ( ) {n,m}を使いたければ-E(=egrep)。^ $ . * [ ]だけで足りるなら素のgrepで十分です。-Eを付ければバックスラッシュでのエスケープが減らせます。

Q. fgrep|を使うとどうなる?

ORにはならず、パイプ記号を含んだ1つの文字列として扱われます。たとえばfgrep 'ping-t|PING-T' fileは「ping-t|PING-T」という11文字のリテラルを探すため、ファイルにその並びが無ければ何もマッチしません。

Q. sedsコマンドで「最初の1回」の書き方は?

フラグを付けないs/old/new/、または数値フラグのs/old/new/1が「最初の1回」を意味します。gを付けると行内全て、2なら2番目のマッチを置換します。

Q. &でマッチ文字列を参照したい場合のフラグは?

&はreplacement側の特殊記号で、フラグには関係しません。s/Book/A &./とすれば最初のマッチをA Book.に変換できます(フラグ無しで各行の最初の1回だけ置換)。


10. まとめ

  • 共通メタ文字.(任意1文字)/*(0回以上)/^(行頭)/$(行末)/[...](文字クラス)/[^...](否定)
  • ERE専用+(1回以上)/?(0または1回、{0,1}と同義)/|(OR)/( ){n,m}。BREは\+ \? \| \( \) \{ \}
  • 文字クラス[A-Z][[:upper:]]は同義。POSIX文字クラスは二重括弧が必須
  • grepの系統grep=BRE/egrep=ERE(grep -E)/fgrep=固定文字列(grep -F|もリテラル)
  • grepオプション-i大小無視/-v反転/-n行番号/-c件数/-lヒットファイル名/-L非ヒットファイル名/-fパターンファイル
  • sed置換:フラグ無し=最初の1回//g=全置換//1=n番目//i/I=大小無視/&=マッチ参照
  • sed削除1,3d(範囲)//^$/d(空行)//^#/d(コメント行、grep -v '^#'と等価)
  • 複数コマンド-e重ね掛け/;連結/-fスクリプトファイル/パイプ

📚 次の主題:エディタを使った基本的なファイル編集の実行(LinuC 1.03.5)


11. 模擬問題にチャレンジ(ランダム出題)

ここまでの内容を本試験に近い形で確認できます。問題数を選んで「出題スタート」を押すと、主題1.03.4の問題プールからランダムに出題されます。選択肢をクリック/タップすると、正誤と解説がその場で表示されます。

合格ライン目安:75%以上。間違えた設問は本文の該当章(2章のメタ文字4章のgrep系統6章のsed置換7章のsed削除など)に戻って知識を補強しましょう。もっと幅広く解きたい場合はLinuC 模擬問題ポータルから他の分野にも挑戦できます。


おすすめの教材


Linux教科書 LPICレベル1

Linux教科書 LPICレベル1 Version 5.0対応(あずき本)

LinuC/LPIC Level1 の定番参考書。正規表現・grep・sedの出題範囲も網羅。


Amazonで見る →

【ウズカレ式】1週間でLinuxの基本操作と管理・運用スキルが学べる講座

累計80,000人以上受講。LinuC Level1(101+102)を1週間で網羅。grep・sedの実践演習も収録。


Udemyで講座を見る →


関連記事

📚 LinuC Level1 完全攻略マップへ戻る
全39サブ項目のシラバス準拠マップから他の記事を探せます

Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

タイトルとURLをコピーしました