以前の記事では、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,6s
3行目から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
コマンドはスクリプト化されており、基本的な操作の実行方法を簡単に学ぶことができます。必要なのは、特に正規表現を使用した練習だけです。