一般的な Linux コマンド (9): sed コマンド (テキストの編集/置換/削除)

sedシリーズの記事

  1. 一般的な Linux コマンド (9): sed コマンド (テキストの編集/置換/削除)
  2. linux sed コマンドは 1 行/複数行を削除します_sed は最初の行を削除します/linux はファイルの特定の行を削除します
  3. Linux sed バッチ変更およびファイル内の内容/sed 特殊文字の置換

1. はじめに

sed (ストリーム エディタ): ストリーム エディタ (ストリーム エディタはパイプなどの標準入力から受け取ったデータを編集できます。)

  • sed 是基于行的,按顺序对每一行执行命令。
  • sed がデータを処理するとき、パターン バッファに行を読み込み、編集コマンドを実行して、パターン バッファを出力します。次に、後続の行ごとにこれらの手順を繰り返します。
  • もう一度強調して、sed是基于行的,逐行处理数据。

sed (ストリーム エディタ): sed は、コマンド ラインから入力されたか、テキスト ファイルに保存されたスクリプト コマンドに基づいて、テキスト ファイル内のデータを処理します。このコマンドで実行されるデータは次のとおりです:

  • 一度に 1 行だけを読んでください。
  • 提供されたルール コマンドに従ってデータを照合および変更します。デフォルトでは、sed はソース ファイルのデータを直接変更しませんが、データをバッファにコピーし、変更はバッファ内のデータに限定されることに注意してください。
  • は実行結果を出力します。
    データの行が一致すると、引き続きデータの次の行を読み取り、ファイル内のすべてのデータが処理されるまでこのプロセスを繰り返します。

1.1. SEDの作業プロセス

sed エディターはファイル (または入力) を 1 行ずつ処理し、出力を画面に送信します。 sed コマンドは、vi および ed/ex エディターにあるコマンドです。 sed は、現在処理中の行をパターンスペースまたは一時バッファーと呼ばれる一時バッファーに保存します。 sed はパターン空間内の行を処理した後 (つまり、その行で sed コマンドを実行した後)、新しい行を画面に送信します (行を削除するか印刷操作をキャンセルするコマンドが以前に存在しなかった場合)。 sed は、入力ファイルの最後の行を処理するたびに操作を終了します。sed は各行を一時バッファに保存し、そのコピーを編集するため、ソース ファイルは変更されたり破壊されたりしません。
ここに画像の説明を挿入します
sed默认不会修改源文件,具体下面的3.1中有讲解。

2. sed 構文

2.1. sed 構文

sed [options] commands [inputfile...]
sed [-n] -f scriptfile files

# 注:
sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0
只有当命令存在语法错误时,sed的退出状态才不是0

2.2. sed 共通オプション

options は sed コマンドのいくつかのオプションを表します。一般的なオプションは次のとおりです。

オプション 説明する
-n -n または --quiet または --silent は Quiet モードを使用します。通常の状況では、すべての STDIN が画面に出力されます。-n を追加すると、sed によって特別に処理された行のみが出力されます。
-それは 複数の編集とコマンドの順序が結果に影響します
-f コマンドラインで実行する sed スクリプト ファイルを指定します。
-r Sed は拡張正規表現を使用します
-私 ドキュメントから読み取った内容を画面に出力せずに直接変更する
-in.back ファイルが変更されると、手動エラーを防ぐためにバックアップ ファイルが作成されます。これは、最初に .bak ファイルをバックアップしてから -i コマンドを実行するのと同じです。

2.3. sed の位置決め

位置が指定されていない場合、sed コマンドはデフォルトですべての行を処理します
sed は次のアドレス タイプをサポートします。

命令 説明する
最初の~ステップ first は一致する開始行を指し、step はステップ サイズを指します。例: sed -n 2~5p 意味: 2 行目から一致を開始し、5 行ごとに一致、つまり 2、7、12…
$ $ 記号は最後の行と一致することを意味します
/正規表現/ // の間の規則的なパターンと一致する、規則的なパターンに一致する行を示します。
\cREGEXPc これは、規則的なパターンに一致する行です。\c と c の間の規則的なパターンによって一致します。c には任意の文字を指定できます。
追加1、追加2 addr1、add2 のアドレス指定により、どの行が編集に使用されるかが決まります。アドレスは、数値、正規表現、またはその両方の組み合わせの形式にすることができます。アドレスが指定されていない場合、sed は入力ファイル内のすべての行を処理します。アドレスが数値の場合、この数値は行番号を表します。カンマで区切られた 2 つの行番号の場合、処理する必要があるアドレスは 2 つの行の間 (両端を含む) になります。範囲には、数値、通常、または両方の組み合わせを指定できます。
アドレス1、+N addr1 行から以下の N 行まで、合計 N+1 行と一致します。
アドレス1、~N 行番号が N の倍数である次の行が入力されるまで、addr1 と addr1 に続く行と一致します。

以下に、sed の位置決めのいくつかの例を示します。

sed '1d' filename  # 删除第一行
sed '$d' filename  # 删除最后一行
sed '2,5d' filename # 删除第2到第5行

2.4. sed 正規表現

grep と同様に、sed でもファイル内のパターンを検索するときに正規表現 (RE) やさまざまなメタキャラクタを使用できます。正規表現はスラッシュ (/xxx/) で囲みます
ここに画像の説明を挿入します

2.5. sedの操作手順

sed 操作コマンドは、アドレスで指定された各入力行をどのように処理するかを sed に指示します。アドレスが指定されていない場合、sed は入力のすべての行を処理します。

次の操作手順は、sed [options] コマンド [inputfile…] の手順を参照します。commands

注文 説明する
a\ 現在の行の後に 1 つ以上の行を追加します
c\ 現在の行のテキストを新しいテキストに変更 (置換) します。
d 行の削除
私\ 現在の行の前にテキストを挿入
h パターンスペースの内容を一時バッファ領域にコピーします。
H パターンスペースの内容を一時キャッシュに追加します
g 一時バッファーの内容を取り出してパターン空間にコピーし、そこにある元の内容を上書きします。
G 一時バッファの内容を取り出してパターン空間にコピーし、元の内容に追加します。
非印刷文字をリストする
p 印刷ライン
n 次の入力行を読み取り、最初のコマンドではなく次のコマンドで処理を開始します。
q sed を終了または終了する
r ファイルから入力行を読み取る
選択された行以外のすべての行にコマンドを適用します
s ある文字列を別の文字列に置き換えます

交換フラグ

g 行内のグローバル置換
p 印刷ライン
ファイルに行を書き込む
バツ スクラッチバッファとパターンスペースの内容を入れ替える

3. sed 構文の概要(重要)

上記では、sed の規則性、オプション、操作手順、sed の配置など、多くの内容を紹介しました。 由于引入的操作指令太多,可能都不清楚怎么使用,这里先引入一些常用的语法便于理解。一般的に使用される構文のリストを次に示します。

3.1. sed の検索内容 (正規表現の使用)

正規表現はスラッシュで囲まれたパターンです(/xxx/)

sed [选项] '[address]/pattern/[flag]' filename

で:

  • アドレスは位置決めを指します。上記の sed 位置決めの使用法を参照してください。
  • フラグは通常、sed 操作コマンドの値です。

例:

sed -n '/root/p' aa.txt   #打印包含root的行  /xxx/是正则表达式的写法
sed -n '10p'  aa.txt      #打印第10行
sed -n '5,10p' aa.txt     #打印第5到第10行
sed -n '5,+5p'  aa.txt   #从第5行开始,往后打印5行,包括第5行
sed -n '8,/sbin\/nologin/p' aa.txt  #打印aa.txt中第8行开始,到含有/sbin/nologin的内容的行结束内容

3.2

4. 実使用・実戦

4.1. sed はソースファイルを破壊しません (sed および sed -i)

sed は、現在処理中の行をパターンスペースまたは一時バッファーと呼ばれる一時バッファーに保存します。 sed はパターン空間内の行を処理した後 (つまり、その行で sed コマンドを実行した後)、新しい行を画面に送信します (行を削除するか印刷操作をキャンセルするコマンドが以前に存在しなかった場合)。 sed は、入力ファイルの最後の行を処理するたびに操作を終了します。 sed は各行を一時バッファに保存し、そのコピーを編集するため、ソース ファイルは変更されたり破壊されたりしません。
ここに画像の説明を挿入します

4.2. 置換: s コマンド(重点)

コマンド s は置換コマンドです。ファイル内のテキストの置換および置換は、sed の s によって実現できます。s の後のスラッシュに含まれるテキストは正規表現で、その後に置換する必要があるテキストが続きます。行のグローバルな置換は、g フラグを介して実行できます。置換関連のコマンドの詳細については、「置換ファイル/sed 特殊文字のコンテンツの Linux sed バッチ変更」 を参照してください。

文法:

sed -i 's/原字符串/替换字符串/g' filename

ここに画像の説明を挿入します
例証します:

  1. -i: -i を追加せずに、ファイル内の内容を直接変更します。効果については、3.1 を参照してください。
  2. 置換にはsコマンドを使用します。コマンドの末尾の g は、行内でのグローバル置換を意味します。つまり、各行に複数の「male」が出現する場合、すべての「male」が「man」に置き換えられます。 g コマンドを使用しないと、各行の最初の「male」だけが「man」に置き換えられます。

4.2.1. sed 置換コンテンツに特殊文字が含まれている

sed s コマンドの元の文字列と置換文字列に特殊文字が含まれている場合は、それらをエスケープできます。特殊文字には、/、& などが含まれます。
ここに画像の説明を挿入します

4.3. 追加: コマンド

a コマンドは追加コマンドであり、ファイル内の現在の行 (つまり、読み取りモードのバッファー行) の末尾に新しいテキストを追加します。コマンドラインでも sed スクリプトでも、コマンドの後には常にバックスラッシュが続きます。
構文は次のとおりです。

匹配行后添加
sed -i "/匹配内容/a添加内容 " filename
而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛 。代码就变成了:
sed -i "/2222222222/a\3333333333 " test.txt

sed -i '1a hello world' test.txt  # 1a则是在第一行的后面添加一行,添加的内容就是a后面的内容,如果a的前面没有地址限定则在所有行的后面都会添加指定的字符串

ここに画像の説明を挿入します

4.4. 挿入: i コマンド

i コマンドは、a コマンドに似た挿入コマンドですが、現在の行の後にテキストを追加するのではなく、現在の行、つまりバッファ モードに読み取られたばかりの行の前に新しいテキストを挿入します。

構文は次のとおりです。

匹配行后添加
sed -i "/匹配内容/i添加内容 " filename
而在书写的时候为便与区分,往往会在i和a前面加一个反加一个反斜扛 。代码就变成了:
sed -i "/2222222222/i\3333333333 " test.txt

sed -i '1i hello world' test.txt #命令i表示在指定的行的前面插入一行,插入的内容为其后面的字符串,如果i的前面没有地址限定则在所有行的前面都会添加指定的字符串

ここに画像の説明を挿入します

4.5. 印刷: p コマンド

コマンドpは、パターンバッファの内容を表示するための印刷コマンドである。デフォルトでは、sed は入力行を画面に印刷します。デフォルトの印刷操作をキャンセルするには、オプション -n が使用されます。オプション -n とコマンド p が一緒に存在する場合、sed は選択内容を出力します。
ここに画像の説明を挿入します

4.6. 削除:dコマンド

コマンド d は入力行を削除するために使用されます。 sed は、まず入力行をファイルからパターン バッファーにコピーし、次にその行で sed コマンドを実行し、最後にパターン バッファーの内容を画面に表示します。コマンド d が発行されると、現在のモード バッファ内の入力行は削除され、表示されなくなります。 d コマンドの使用方法の詳細については、「linux sed コマンドは 1 行/複数行を削除します_sed は最初の行を削除します/linux はファイルの特定の行を削除します。」を参照してください。 2>"

sed -i '1d' filename   删除文件第一行
sed -i '2d' filename   删除第二行
sed -i 'nd' filename   删除第n行/n需要是实际数字
sed -i '$d' filename   删除最后一行
sed -i '1,3d' filename   删除1-3行
sed -i '3,$d' filename  删除第3行到最后一行

sed -i '/^$/d' filename  # 删除所有空白行
編集コマンド 意味
1日 1行目の内容を削除
1,5日 1行目から5行目までの内容を削除
2,+5d 2行目以降の5行の内容を削除
/パターン1/d 各行の pattern1 に一致する行の内容を削除します
/パターン1/、/パターン2/d すべての行がパターン 2 に一致するまで、パターン 1 に一致する行を削除します。
/パターン1/,10d pattern1 から 10 行目までに一致するすべての行を削除します
10,/パターン1/d 10行目からpattern1が一致するまでをすべて削除します。

4.7. 行の範囲を指定: カンマ

行の範囲は、ファイル内の 1 つのアドレスで始まり、別のアドレスで終わります。アドレス範囲には、行番号 (例: 5,10)、正規表現 (例: /Dick/ および /Joe/)、または 2 つの組み合わせ (例: /north/、$) を指定できます。範囲は閉じられています。開始条件の行、条件を終了する行、およびその間の行。終了条件が満たされない場合、操作はファイルの終わりまで続行されます。終了条件が満たされると、引き続き開始条件を満たす位置が検索され、範囲が再び開始されます。
1>行番号で範囲を指定します
ここに画像の説明を挿入します
2>正規表現で範囲を指定します
ここに画像の説明を挿入します

4.8. 変更: c コマンド

c コマンドは変更コマンドです。 sed このコマンドを使用して、既存のテキストを新しいテキストに変更します。古いテキストは上書きされます。

sed -i '/Bill/c Billion' test.txt # 将包含Bill的行整行替换为Billion

sed -i '1c hello world' test.txt  #命令c会替换指定的行的所有内容,替换成其后面的字符串,所有的新增,删除,替换行,这些命令前面的地址修饰都可以指定地址空间,也都可以使用正则表达式,命令会应用在选出的符合地址条件的所有行上面,例如:

sed -i '/^2/c hello world' test.txt  #替换以2开头的行,其内容是c命令后面的字符串

ここに画像の説明を挿入します

4.9. 終了: q コマンド

q コマンドは終了コマンドを示します。このコマンドにより、sed プログラムはそれ以上の処理を行わずに終了します。
ここに画像の説明を挿入します
行 3 を出力した後、q により sed プログラムが終了します。





この記事を整理しているときに、学ぶ価値のある他の記事をいくつか見つけました: https://blog.csdn.net/bandaoyu/article/details/120047612 https://blog.csdn.net/weixin_42445727/article/details/120431735 https ://www.cnblogs.com/A121/p/10621152.html https://www.cnblogs.com/maxincai/p/5146338.html https://www.cnblogs.com/ginvip/p/6376049.html

おすすめ

転載: blog.csdn.net/weixin_49114503/article/details/134919510