GNU/Linux >> Linux の 問題 >  >> Linux

sedを使用してコマンドラインでテキストを操作する

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


Linux
  1. スマートクォートをLinuxsedコマンドに置き換えます

  2. Sedテキストエディタの使い方を学ぶ

  3. コマンドラインでsortを使用してソートする

  1. Linuxコマンドラインでのデータストリームの操作

  2. screenieを使用したコマンドラインでのマルチタスク

  3. コマンドラインでXキーとポインターグラブを操作しますか?

  1. コマンドラインで相対パスを使用してファイルシステムをナビゲートする

  2. Linuxコマンドラインでのパイプの操作

  3. ファイルの最初の行の前にテキストを挿入する方法は?