Linux コマンドとシェル スキル
sed: エディタを開かずにストリームを編集する
sed は横方向に編集します。テキストのストリーム全体がそれを通過し、変換されて出てくるため、エディターは開きません。その評判は、1 行の置換を数千のファイルにわたるバッチ操作に変換する -i と、バックアップ接尾辞なしでそれを実行した管理者の惨事の話から来ています。安全なワークフローは決して変わりません。表示された置換を実行し、出力を確認してから、サフィックスを付けて -i を追加し、終了コードを保持します。
要点
- コミットする前にプレビューします。 sed -n '10,20p' ファイルには行範囲が表示され、同じ -n と p の組み合わせにより、正規表現またはアドレスに一致する行のみが出力されます。
- 意図したとおりのフラグで置き換えます。すべての一致の場合は s/old/new/g、2 番目の一致の場合は 2g などの数字、バックスラッシュ エスケープのページを含まない拡張正規表現の場合は -E です。
- インプレース編集にはサフィックスが付けられますが、例外はありません。 sed -i.bak の/http:/https:/g' アプリは、すべての変更の横に同じ名前のバックアップを保持します。このサフィックスにより、どのエディターの取り消し履歴よりも多くのデプロイが救われました。
- 区切り文字は自由です: s|/var/www|/srv/app|g (または s#...#g) は、パターンがパスでいっぱいの場合にスラッシュ エスケープの競合を回避します。
- -i はアトミックではありません。バッチ中にクラッシュまたは不正な正規表現が発生すると、半分書き換えられたファイルが残されるため、一括ジョブは唯一のコピーではなく、コピーまたは git-tracked ツリーに対して実行されます。
- GNU と BSD の sed は -i に関して意見が異なります。BSD ではスクリプトの前にサフィックスが必要です (sed -i '' は macOS で動作しますが、Linux 構文ではありません)。これが移植性スクリプトが -i を完全に避けるもう 1 つの理由です。
- 削除と分離は正直な動詞です。'd' は一致する行を削除し (sed '/^#/d' はコメントを削除します)、範囲を指定した -n はセクションを分離します。どちらも賢い置換よりも読みやすいです。
- 単一行の編集、リテラルの複数行ブロック、またはステートフル結合以降はすべて、awk または実際のスクリプトに属します。 sed にプログラマの仕事を強制すると、読みにくいワンライナーが生まれます。
現場ノート
.bak サフィックスのない最初の sed -i は、午後のトラフィックのピークの直前に本番環境の nginx 構成にヒットしました。それ以来、すべてのインプレース編集にはバックアップ接尾辞が付けられるようになり、-i がコマンドに近づく前に予行演習の出力を読みました。
よくある質問
他の行と一致する行のみを編集するにはどうすればよいですか?
それらに対処します。sed '/cache/s/true/false/' はキャッシュ行でのみ true を false に切り替え、'/<VirtualHost>/,/<\/VirtualHost>/s/Old/New/g' のような範囲はブロックに編集します。アドレスが最初に、コマンドが 2 番目になります。
sed が Windows で編集されたファイルの行末と一致しないのはなぜですか?
これらの行は、「$」アンカーが予期しない復帰文字で終わります。最初に tr でそれらを削除するか、途中で正規化すると、複数行のコンテンツは -0777 で awk または Perl に属したままになります。
単純な置換の場合、sed は awk よりも高速ですか?
ほんのわずかかつ無関係に。どちらも、構成サイズのファイルではミリ秒以内に終了します。同僚はあなたのワンライナーを 6 か月以内に解読する必要があるため、読みやすさを重視して選択してください。
sed を使用して構成ブロック全体を挿入できますか?
はい: 'a' は後に追加し、'i' は前に挿入し、'c' は行を置き換えます。ただし、挿入されるテキストは単純かつ目的のみに留めてください。実際のブロックは、テンプレート ファイルまたは適切なプロビジョニング ステップに属します。
linux コマンドとシェル スキル に対するKinetikatechの支援
これは何百回と対応してきたケースです:管理者がサーバーを操作するかサーバーと戦うかを決定するコマンドとスクリプトの習慣。すべての基本インストールに存在するツールを使用して、テキストとプロセスを検索、変換、転送、監視します。 Linuxサーバーセキュリティとサーバー管理で、評価、実装、24時間体制の監視、そして重要な時に30分以内の対応という、完全なサイクルを提供します。