以前の記事では、grepを使用してテキストを操作する方法について説明しました。 。次に、sedに注意を向けます。 (ストリームエディタ)。パイプライン(パイプからのデータ)での使用に最適です。 sed ユーティリティを使用して、ファイルの内容を印刷し、1行(または複数行)に置き換えてから、ファイルを保存できます。 grepとは対照的 、sed ファイル内の1行または複数行を置き換えて、インプレースを実行できます。 そのファイルの更新。
最も単純なsed fooを置き換えるときの呼び出し barの場合 は:
$ sed 's/foo/bar/' inputfile 例:コメントを削除する
grep 画面上の出力をフォーマットできますが、その場でファイルを変更することはできません。これを行うには、edのようなファイルエディタが必要です 。 ed以降 この記事には含まれていません。sedを使用してください grepで行ったのと同じことを実現するため 前の記事の最初の例で。今回は/etc/fstabを変更します -iを渡すインプレースファイル sedへのフラグ 。 -iなし フラグを立てると、変更されたものだけが表示されます。
常にsedを実行することをお勧めします -iなし フラグ、それが生成する結果が期待されることを確認するためだけに。 sed ユーティリティは-i.bakも提供します フラグ。編集前にバックアップファイルを作成します。
最後のgrep この例のコマンドは次のとおりです。
$ grep -v '^#' /etc/fstab > ~/fstab_without_comment
sedを使用 、あなたは持っています:
# sed -i '/^#/d' /etc/fstab
/dev/mapper/VGCRYPTO-ROOT / ext4 defaults,x-systemd.device-timeout=0 1 1
UUID=e9de0f73-ddddd-4d45-a9ba-1ffffa /boot ext4 defaults 1 2
LABEL=SSD_SWAP swap swap defaults 0 0
例:/etc/passwdのみを印刷します ユーザー
grep内 たとえば、/etc/passwdからのユーザー名のみを印刷しました 次のファイル:
$ grep -Eo '^[a-zA-Z_-]+' /etc/passwd
sedを使用して同じことを行うことができます 次のように:
$ sed 's/^\([a-zA-Z_-]\+\).*/\1/' /etc/passwd
上記の例では、一致を括弧でグループ化しています() 、次に一致したグループを\1で印刷します (後方参照)、これは最初のグループを指示します。 2番目のグループには、\2を使用します 、など。
例:すべてのfooを置き換えます bar付き
sedで 、パターンを検索して、パターンに一致するオカレンスのみを置き換えることができます。ファイル内のすべてのオカレンスを置き換えるにはinputfile1 fooから barへ グローバルに実行:
$ sed -i '/foo/bar/g' inputfile1
例:単一のインスタンスを置き換える
ファイルinputfile2を取得します 、次の内容が含まれています:
hello world
second line should be replaced
this line should be replaced later
shouldを置き換えたいと言ってください will 、ただし2行目のみ。このコマンドは次のように分類されます。
$ sed '/second/s/should/will/' inputfile2
| | | |
| | | with this pattern
| | this pattern
| substitute
Search for the pattern "second"
この出力は、ファイルの内容を置き換えるのではなく、標準出力に送信されます。結果は次のようになります:
$ sed '/second/s/should/will/' inputfile2
hello world
second line will be replaced
this line should be replaced later
sed コマンドでは大文字と小文字が区別されます。 Worldを置き換えようとすると、以下は機能しません there :
$ echo "Hello World" | sed 's/world/there/'
Hello World
GNU sed 新しいフラグ/Iを導入しました 、ケースを無視し、 同じコマンドで置換を実行します:
$ echo "Hello World" | sed 's/world/there/I'
Hello there
例:行の範囲を印刷して終了します
sedを使用 、行を印刷して、基準が満たされた後に終了することもできます。次のコマンドは、3行を出力して終了します。このコマンド:
$ sed -n '1,3p' /etc/passwd
と同等です:
$ sed '3q' /etc/passwd
以下は間違っているでしょう:
$ sed '1,3q' /etc/passwd # Wrong. You cannot quit three times
例:コメントされていない行をコメントアウトする
正規表現は、sedでも使用できます 、前に示したように。たとえば、次の小さなスクリプトがあります。
$ cat test_script
#/usr/bin/env bash
this is the first comment
This is another comment
# this is a comment too
echo "This is not a comment and should be echoed"
ここで、#!/bin/bashで始まる最初の行をスキップする必要があります 、3行目と4行目をコメントアウトしますが、5行目はすでにコメント化されているため、コメントアウトしません。
sedで 、次のようなものを使用できます:
$ sed '3,6s/^[^#]/# &/g' test_script
#/usr/bin/env bash
# this is the first comment
# This is another comment
# this is a comment too
echo "This is not a comment and should be echoed"
上記のコマンドでは、以下が実行されます。
-
3,6s3行目から6行目までの範囲を定義します。 -
/^[^#]/文字であり、ハッシュ(#で始まらない)すべてに一致します 。 -
/# &/gパーツを置き換えます。この場合、#を配置します。&で指定された行の前 サイン。
例:すべての数字を削除する
さまざまなアプリケーションがさまざまな形式でデータを生成します。 sedを使用 、使用できるデータのみを保持できます。たとえば、次のファイルがあります(inputfile3 )この形式:
foo1234
bar99128
baz2842
qux12953
discard39120
プログラムが間違った形式を生成したか、フィールドを1つに連結した可能性があります。英字のみを保持することに関心があり、数字を破棄したい場合はどうなりますか? sedでこの目標をどのように達成しますか ?
答えはおそらくあなたが思っているよりも簡単です:
$ sed 's/\([a-z]*\).*/\1/' inputfile3
foo
bar
baz
qux
discard
例:特定の行を変更する
さらに、sed パターンごとに範囲を処理することもできます。つまり、 startを指定できます。 および終了 文字列を作成し、範囲を操作します。例:
$ cat inputfile4
hello world
start of the comment
another comment
end of a comment
dont comment this line
nor this line
次のsed コマンドは、 startで始まる行にコメントを付けます endで終わります :
$ sed '/start/,/end/ s/^/# /' inputfile4
hello world
# start of the comment
# another comment
# end of a comment
dont comment this line
nor this line
空の行も削除します。
$ sed '/start/,/end/ s/^/# /;/^$/d' inputfile4
hello world
# start of the comment
# another comment
# end of a comment
dont comment this line
nor this line
sedにはまだまだたくさんのことがあります とその豊富な機能。 sedを十分に活用できるようにするため の能力については、こちらのドキュメントページをご覧ください。また、sedに関する優れた情報源 ここで見つけることができます。
前に説明したように、grepを使用します ファイルまたは複数のディレクトリでパターンを再帰的に検索する場合。 sedを使用する パイプラインからデータを受信している場合、またはデータをその場で操作したい場合。
sed コマンドはスクリプト化されており、基本的な操作の実行方法を簡単に学ぶことができます。必要なのは、特に正規表現を使用した練習だけです。