正規表現とsed/awkの組み合わせ
正規表現を「sed」や「awk」コマンドに組み込み、高度なテキストのフィルタリング、置換、データ抽出を行います。
「正規表現とsed/awkの組み合わせ」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
sedとawkで正規表現を使う
正規表現の最終レッスンへようこそ。これまで、パターンマッチングにおける正規表現の力について学んできました。
ここでは、その力をLinuxの重要な2つのツール、sed(ストリームエディタ)とawk(パターンスキャン・処理言語)と組み合わせます。この連携により、高度なテキストのフィルタリング、置換、データ抽出が可能になります。
sed:正規表現によるフィルタリング
sedでは、正規表現を使って行をフィルタリングできます。/pattern/アドレスを指定すると、指定した正規表現にマッチする行に対してのみsedがコマンドを適用します。
-nオプションはデフォルトの出力を抑制し、pはマッチした行を明示的に出力します。
echo -e "apple
banana
orange" | sed -n '/an/p'sed:正規表現による置換
sedのs/regex/replacement/コマンドは、テキスト変換で正規表現の力を発揮する部分です。正規表現で見つかったパターンを新しいテキストに置き換えられます。
gフラグは行内のすべての出現箇所を置換し、iは大文字と小文字を区別せずにマッチさせます。
echo "Hello world, hello universe" | sed 's/hello/hi/gi'sed:キャプチャグループと後方参照
正規表現では、丸括弧()を使ってキャプチャグループを定義できます。さらに、後方参照(\1、\2など)を使って、置換文字列内でこれらのグループにマッチしたテキストを参照できます。
拡張正規表現の構文(エスケープなしの()など)を使うには、sedとともに-Eを使用します。
echo "Doe, John" | sed -E 's/([A-Za-z]+), ([A-Za-z]+)/\2 \1/'awk:正規表現によるレコードのフィルタリング
awkでは、アクションを実行する前に正規表現のパターンでレコード(行)を選択します。アクションブロック{...}の前にパターンを指定すると、そのパターンにマッチする行に対してのみアクションが実行されます。
これはgrepに似ていますが、より複雑な処理にも対応できます。
echo -e "Line 1: apple
Line 2: banana
Line 3: orange" | awk '/banana/'awk:特定のフィールドへの正規表現の適用
awkでは、~(マッチする)演算子と!~(マッチしない)演算子を使って、特定のフィールドに正規表現のパターンを適用できます。構造化データを扱う場合に非常に強力です。
たとえば、$1 ~ /pattern/は、1番目のフィールドが正規表現にマッチするかどうかを確認します。
echo "Name: John, Age: 30
Name: Jane, Age: 25" | awk '$1 ~ /Name/ {print $2}'awk:マッチ結果の抽出(match、substr)
awkには、マッチの位置と長さを調べるmatch(string, regex)や、マッチした部分を抽出するsubstr(string, start, length)などの関数があります。
match()の実行後は、マッチの開始位置がRSTARTに、マッチの長さがRLENGTHに格納されます。
echo "ItemCode: ABC123 Price: 45.67" | awk '{match($0, /[0-9]+\.[0-9]+/); print substr($0, RSTART, RLENGTH)}'awk:その場での置換(sub、gsub)
awkには置換用の組み込み関数もあります。sub(regex, replacement, target)は最初のマッチを、gsub(regex, replacement, target)はすべてのマッチを置換します。
targetを省略すると、$0(レコード全体)が使われます。$1のようにフィールドを指定することもできます。
echo "apple,banana,orange" | awk '{gsub(/a/, "X", $0); print}'sedとawkの使い分け
sedとawkはどちらも正規表現による置換やフィルタリングに対応していますが、それぞれ得意な分野が異なります。
sedは、単純な行単位の変換や置換に適しています。ストリームエディタです。awkは、構造化データ(フィールド)の処理、計算、より複雑なロジックや複数行のパターンの処理に適しています。それ自体がプログラミング言語です。
複雑な処理では、パイプ|で両者をつなげて使うこともよくあります。
チャレンジ:抽出と変換
次のテキスト行について考えてみましょう。
Order#12345: ProductX - Price $19.99価格(例:「19.99」)を正しく抽出し、その後で通貨記号を「EUR」に変更するコマンドはどれでしょうか。
おさらい:sedとawkで正規表現を使う
正規表現をsedやawkと組み合わせて使えるようになりました。
sedは、正規表現による強力なパターンマッチングと置換を使い、行単位でのテキストのフィルタリングと置換を得意とします。awkはよりプログラム的なアプローチを提供します。正規表現によるレコードのフィルタリング、特定のフィールド内でのマッチング、match()、substr()、sub()、gsub()などの関数を使ったデータの抽出・変更が可能です。
このスキルは、Linuxで高度なテキスト処理やスクリプトを作成するうえで重要です。
よくある質問
「正規表現とsed/awkの組み合わせ」レッスンは無料ですか?
はい。「正規表現とsed/awkの組み合わせ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「正規表現とsed/awkの組み合わせ」で何を学びますか?
正規表現を「sed」や「awk」コマンドに組み込み、高度なテキストのフィルタリング、置換、データ抽出を行います。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「正規表現とsed/awkの組み合わせ」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 正規表現(Regex)入門
- 正規表現を使った高度なGrep
- 正規表現とsed/awkの組み合わせ
- キャプチャグループ、後方参照、置換