[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
内の apple
を orange
に置換する場合は次のようになります。
sed 's/apple/orange/' sample.txt
正規表現を使った置換
sed
では、正規表現を使ってより柔軟な置換が可能です。
例えば、任意の数字を #
に置換する場合は次のように記述します。
sed 's/[0-9]/#/g' ファイル名
このコマンドは、ファイル内のすべての数字を #
に置換します。
gオプションで全ての一致を置換
デフォルトでは、sed
は行内の最初の一致のみを置換しますが、g
オプションを使うことで行内のすべての一致を置換できます。
以下のように記述します。
sed 's/置換前の文字列/置換後の文字列/g' ファイル名
例えば、sample.txt
内のすべての apple
を orange
に置換する場合は次のようになります。
sed 's/apple/orange/g' sample.txt
特定の行のみを置換する方法
特定の行のみを置換するには、行番号を指定します。
例えば、3行目の apple
を orange
に置換する場合は次のように記述します。
sed '3s/apple/orange/' ファイル名
このコマンドは、3行目の apple
のみを置換します。
複数の置換を一度に行う方法
複数の置換を一度に行うには、;
でコマンドを区切ります。
以下のように記述します。
sed -e 's/apple/orange/' -e 's/banana/grape/' ファイル名
このコマンドは、sample.txt
内の apple
を orange
に、さらに banana
を grape
に置換します。
行の操作
特定の行を削除する
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/置換後の文字列/' ファイル名
このコマンドは、a
とb
の間に任意の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.txt
とfile2.txt
の両方で apple
を orange
に置換する場合は次のように記述します。
sed 's/apple/orange/' file1.txt file2.txt
このコマンドは、両方のファイル内の apple
を orange
に置換します。
出力は標準出力に表示されますが、ファイルを直接変更する場合は次の方法を使用します。
ファイルのバックアップを作成する
ファイルを直接編集する際に、元のファイルのバックアップを作成することができます。
-i
オプションを使用し、バックアップファイルの拡張子を指定します。
例えば、file.txt
の内容を変更し、バックアップをfile.txt.bak
として保存する場合は次のように記述します。
sed -i.bak 's/apple/orange/' file.txt
このコマンドを実行すると、file.txt
が変更され、元の内容がfile.txt.bak
に保存されます。
これにより、元のデータを失うことなく編集が可能です。
ファイルの内容を直接変更する
sed
を使ってファイルの内容を直接変更するには、-i
オプションを使用します。
例えば、file.txt
内の apple
を orange
に置換する場合は次のように記述します。
sed -i 's/apple/orange/' file.txt
このコマンドは、file.txt
内のすべての apple
を orange
に置換し、変更をファイルに直接反映させます。
-i
オプションを使用することで、標準出力に出力することなく、ファイルの内容を即座に変更できます。
応用例
CSVファイルの編集
CSVファイルの編集には、sed
を使って特定の列のデータを変更することができます。
例えば、カンマ区切りのCSVファイル内で、2列目の apple
を orange
に置換する場合は次のように記述します。
sed 's/\([^,]*,\)apple/\1orange/' file.csv
このコマンドは、最初のカンマまでの部分を保持しつつ、2列目の apple
を orange
に置換します。
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
コマンドを連結して使うことで、複雑な処理を一度に行うことができます。
例えば、ファイル内の apple
を orange
に置換し、同時に banana
を grape
に置換する場合は次のように記述します。
sed -e 's/apple/orange/g' -e 's/banana/grape/g' file.txt
このコマンドは、file.txt
内のすべての apple
を orange
に、すべての banana
を grape
に置換します。
-e
オプションを使うことで、複数の置換を一度に実行できます。
よくある質問
まとめ
この記事では、sed
コマンドを使用した複雑な文字列処理の方法について詳しく解説しました。
基本的な構文から始まり、文字列の置換、行の操作、正規表現を用いた高度な処理、さらには複数ファイルの処理や応用例に至るまで、幅広い内容をカバーしています。
これを機に、実際のテキスト処理にsed
を活用し、効率的な作業を行ってみてはいかがでしょうか。