[Linux] sedコマンドの使い方 – 複雑な文字列処理

sedコマンドは、Linuxでテキストの編集や変換を行うためのストリームエディタです。

複雑な文字列処理には、正規表現を活用してパターンマッチングや置換を行います。

基本的な使い方はsed 's/検索パターン/置換文字列/' ファイル名です。

複数行にまたがる処理や、特定の行範囲に対する操作も可能です。

例えば、sed -n '2,5p'は2行目から5行目までを表示します。

-rオプションで拡張正規表現を使用することもできます。

この記事でわかること
  • sedコマンドの基本的な使い方
  • 文字列の置換方法と応用
  • 行の操作に関するテクニック
  • 正規表現を活用した処理
  • 複数ファイルの効率的な編集方法

目次から探す

sedコマンドの基本構文

sed(ストリームエディタ)は、テキストファイルの処理や変換を行うための強力なコマンドラインツールです。

基本的な構文は以下のようになります。

sed [オプション] 'コマンド' ファイル名

ここで、オプション-e(複数のコマンドを指定する)、-i(ファイルを直接編集する)などがあり、コマンドは実行したい操作を指定します。

例えば、文字列の置換や行の削除などが含まれます。

sedは、標準入力からデータを受け取ることもでき、パイプを使って他のコマンドと組み合わせることが可能です。

これにより、データの流れを効率的に処理することができます。

sedを使いこなすことで、テキスト処理の効率が大幅に向上します。

文字列の置換

基本的な置換の方法

sedを使った基本的な文字列の置換は、以下のように行います。

sed 's/置換前の文字列/置換後の文字列/' ファイル名

このコマンドは、指定したファイル内の最初の一致を置換します。

例えば、sample.txt内の appleorange に置換する場合は次のようになります。

sed 's/apple/orange/' sample.txt

正規表現を使った置換

sedでは、正規表現を使ってより柔軟な置換が可能です。

例えば、任意の数字を # に置換する場合は次のように記述します。

sed 's/[0-9]/#/g' ファイル名

このコマンドは、ファイル内のすべての数字を # に置換します。

gオプションで全ての一致を置換

デフォルトでは、sedは行内の最初の一致のみを置換しますが、gオプションを使うことで行内のすべての一致を置換できます。

以下のように記述します。

sed 's/置換前の文字列/置換後の文字列/g' ファイル名

例えば、sample.txt内のすべての appleorange に置換する場合は次のようになります。

sed 's/apple/orange/g' sample.txt

特定の行のみを置換する方法

特定の行のみを置換するには、行番号を指定します。

例えば、3行目の appleorange に置換する場合は次のように記述します。

sed '3s/apple/orange/' ファイル名

このコマンドは、3行目の apple のみを置換します。

複数の置換を一度に行う方法

複数の置換を一度に行うには、;でコマンドを区切ります。

以下のように記述します。

sed -e 's/apple/orange/' -e 's/banana/grape/' ファイル名

このコマンドは、sample.txt内の appleorange に、さらに bananagrape に置換します。

行の操作

特定の行を削除する

sedを使って特定の行を削除するには、行番号を指定してdコマンドを使用します。

例えば、3行目を削除する場合は次のように記述します。

sed '3d' ファイル名

このコマンドは、指定したファイルの3行目を削除します。

複数の行を削除したい場合は、カンマで区切って指定できます。

例えば、2行目から4行目を削除する場合は次のようにします。

sed '2,4d' ファイル名

行の挿入

特定の行の前または後に新しい行を挿入するには、i(挿入)またはa(追加)コマンドを使用します。

例えば、3行目の前に「新しい行」を挿入する場合は次のように記述します。

sed '3i 新しい行' ファイル名

3行目の後に挿入する場合は、次のようにします。

sed '3a 新しい行' ファイル名

行の置換

特定の行を置換するには、行番号を指定してsコマンドを使用します。

例えば、3行目の内容を「新しい内容」に置換する場合は次のように記述します。

sed '3s/.*/新しい内容/' ファイル名

このコマンドは、3行目のすべての内容を「新しい内容」に置き換えます。

行のコピーと移動

行をコピーして別の位置に移動するには、tコマンドを使用します。

例えば、3行目を5行目の後にコピーする場合は次のように記述します。

sed '3t5' ファイル名

このコマンドは、3行目を5行目の後にコピーします。

行を移動する場合は、削除と挿入を組み合わせて行います。

行の結合

複数の行を結合するには、Nコマンドを使用します。

例えば、2行目と3行目を結合する場合は次のように記述します。

sed '2N' ファイル名

このコマンドは、2行目と3行目を結合し、1つの行にします。

結合後の行は、改行で区切られた内容になります。

行の結合を行う際は、必要に応じて-eオプションを使って他の操作と組み合わせることも可能です。

正規表現を使った高度な文字列処理

基本的な正規表現の使い方

sedでは、基本的な正規表現を使用してパターンマッチングを行うことができます。

例えば、任意の文字を表す.や、特定の文字の集合を表す[abc]を使って、特定のパターンを検索・置換できます。

以下の例では、任意の1文字を含む a.b を検索し、置換します。

sed 's/a.b/置換後の文字列/' ファイル名

このコマンドは、abの間に任意の1文字がある場合にマッチします。

拡張正規表現の使用方法

sedでは、拡張正規表現を使用するために-Eオプションを指定します。

これにより、+?などの特殊文字をそのまま使用できます。

例えば、1回以上の数字を検索する場合は次のように記述します。

sed -E 's/[0-9]+/置換後の文字列/' ファイル名

このコマンドは、1回以上の数字にマッチし、置換を行います。

特殊文字のエスケープ

正規表現では、特定の文字(例:.*?+など)は特別な意味を持ちます。

これらの文字を文字通りに扱いたい場合は、バックスラッシュ\でエスケープする必要があります。

例えば、.を文字として扱う場合は次のように記述します。

sed 's/\./置換後の文字列/' ファイル名

このコマンドは、ドット.を含む文字列を置換します。

グループ化と参照

正規表現では、グループ化を行うことで、特定の部分をまとめて扱うことができます。

グループ化は、丸括弧()を使って行います。

また、グループ化した部分は\1\2などで参照できます。

以下の例では、同じ単語を2回繰り返すパターンを検索し、置換します。

sed 's/\(word\) \1/置換後の文字列/' ファイル名

このコマンドは、 word word というパターンを見つけて置換します。

行頭・行末の処理

行頭や行末を指定するには、^(行頭)や$(行末)を使用します。

例えば、行頭に Start: を追加する場合は次のように記述します。

sed 's/^/Start: /' ファイル名

行末に :End を追加する場合は次のようにします。

sed 's/$/:End/' ファイル名

これにより、各行の先頭や末尾に特定の文字列を追加することができます。

複数ファイルの処理

複数ファイルを一度に処理する

sedを使って複数のファイルを一度に処理することができます。

ファイル名をスペースで区切って指定することで、同じ操作を複数のファイルに適用できます。

例えば、file1.txtfile2.txtの両方で appleorange に置換する場合は次のように記述します。

sed 's/apple/orange/' file1.txt file2.txt

このコマンドは、両方のファイル内の appleorange に置換します。

出力は標準出力に表示されますが、ファイルを直接変更する場合は次の方法を使用します。

ファイルのバックアップを作成する

ファイルを直接編集する際に、元のファイルのバックアップを作成することができます。

-iオプションを使用し、バックアップファイルの拡張子を指定します。

例えば、file.txtの内容を変更し、バックアップをfile.txt.bakとして保存する場合は次のように記述します。

sed -i.bak 's/apple/orange/' file.txt

このコマンドを実行すると、file.txtが変更され、元の内容がfile.txt.bakに保存されます。

これにより、元のデータを失うことなく編集が可能です。

ファイルの内容を直接変更する

sedを使ってファイルの内容を直接変更するには、-iオプションを使用します。

例えば、file.txt内の appleorange に置換する場合は次のように記述します。

sed -i 's/apple/orange/' file.txt

このコマンドは、file.txt内のすべての appleorange に置換し、変更をファイルに直接反映させます。

-iオプションを使用することで、標準出力に出力することなく、ファイルの内容を即座に変更できます。

応用例

CSVファイルの編集

CSVファイルの編集には、sedを使って特定の列のデータを変更することができます。

例えば、カンマ区切りのCSVファイル内で、2列目の appleorange に置換する場合は次のように記述します。

sed 's/\([^,]*,\)apple/\1orange/' file.csv

このコマンドは、最初のカンマまでの部分を保持しつつ、2列目の appleorange に置換します。

HTMLタグの削除

HTMLファイルからタグを削除するには、sedを使って特定のパターンを検索し、置換します。

例えば、すべてのHTMLタグを削除する場合は次のように記述します。

sed 's/<[^>]*>//g' file.html

このコマンドは、<>の間にあるすべての文字を削除し、タグを取り除きます。

結果として、テキストのみが残ります。

ログファイルのフィルタリング

ログファイルから特定のエラーメッセージを抽出するには、sedを使ってパターンマッチングを行います。

例えば、 ERROR という文字列を含む行を抽出する場合は次のように記述します。

sed -n '/ERROR/p' log.txt

このコマンドは、log.txt内の ERROR を含む行のみを表示します。

-nオプションを使うことで、マッチした行だけを出力します。

特定のパターンを含む行の抽出

特定のパターンを含む行を抽出するには、sedのパターンマッチングを利用します。

例えば、「重要」という単語を含む行を抽出する場合は次のように記述します。

sed -n '/重要/p' file.txt

このコマンドは、file.txt内の「重要」を含む行をすべて表示します。

-nオプションを使用することで、マッチした行だけを出力します。

複数のsedコマンドを連結して使う

複数のsedコマンドを連結して使うことで、複雑な処理を一度に行うことができます。

例えば、ファイル内の appleorange に置換し、同時に bananagrape に置換する場合は次のように記述します。

sed -e 's/apple/orange/g' -e 's/banana/grape/g' file.txt

このコマンドは、file.txt内のすべての appleorange に、すべての bananagrape に置換します。

-eオプションを使うことで、複数の置換を一度に実行できます。

よくある質問

sedコマンドで大文字と小文字を区別しない置換は可能?

はい、sedコマンドで大文字と小文字を区別しない置換を行うことができます。

Iオプションを使用することで、ケースインセンシティブ(大文字小文字を区別しない)な置換が可能です。

例えば、 appleApple の両方を orange に置換する場合は次のように記述します。

例:sed 's/apple/orange/I' file.txt

sedで空白行を削除するには?

空白行を削除するには、sedを使って空行をマッチさせて削除することができます。

以下のコマンドを使用します。

sed '/^$/d' file.txt

このコマンドは、空行(何もない行)を見つけて削除します。

また、空白文字のみの行も削除したい場合は、次のように記述します。

例:sed '/^[[:space:]]*$/d' file.txt

sedで複数行にまたがるパターンを処理する方法は?

sedは基本的に1行ずつ処理しますが、複数行にまたがるパターンを処理するためには、Nコマンドを使用して行を結合することができます。

例えば、2行にまたがるパターンを検索する場合は次のように記述します。

sed -n '/pattern1/{N;/pattern2/p}' file.txt

このコマンドは、pattern1が含まれる行とその次の行を結合し、pattern2が含まれる場合にその行を出力します。

これにより、複数行にまたがるパターンを処理することができます。

まとめ

この記事では、sedコマンドを使用した複雑な文字列処理の方法について詳しく解説しました。

基本的な構文から始まり、文字列の置換、行の操作、正規表現を用いた高度な処理、さらには複数ファイルの処理や応用例に至るまで、幅広い内容をカバーしています。

これを機に、実際のテキスト処理にsedを活用し、効率的な作業を行ってみてはいかがでしょうか。

  • URLをコピーしました!
目次から探す