sed 複雑なスクリプト

sed 複雑なスクリプト

理解しようとするこれは素晴らしい答えですの使い方を説明しますsed

いくつかのテストデータを設定しました。

printf "Line #%2d\n" {1..7} >file

その後実行

sed -e \$$'{w/dev/stdout\n;d}' -i~ file

このコマンドを理解しようとしていますsed。これまで私が考えたことは次のとおりです。

  1. -e

-e script, --expression=script 実行するコマンドにスクリプトを追加します。

  1. この回答について説明してください/dev/stdout

  2. \n改行文字を表します。

  3. -i~

-i[サフィックス]、--in-place[=サフィックス]

ファイルを所定の位置に編集します(拡張子が指定されている場合はバックアップ)。

私はまだ理解できません。

答え1

最初のコマンドは、7行のテキストを含むファイルを作成します。このデータが使用されますだから答えはsedこのコマンドの効果を説明するためにfile

$'...'sed(「C文字列」)を理解し、GNU(理解d}済み)を使用するシェルが与えられると、d;}2番目のコマンドはテストデータファイルの最後の行を標準出力に返し、ファイルから削除して生データをバックアップします(このfile~生データをバックアップするタスクです)。file~-i~

SO回答では、sed編集スクリプトはコマンドラインに次のように書かれています。

\$$'{w/dev/stdout\n;d}'

これはリテラルで、$その後に「C文字列」が続きます$'{w/dev/stdout\n;d}'。 C文字列の引用符は、\nリテラル改行で拡張されるようになっています。

${w/dev/stdout
;d}

...それは粗末なスクリプトsed方法です。

$ {
    w /dev/stdout
    d
}

このsed編集スクリプトは、変更されていない最後の行を除くすべての項目を出力に渡します(オプションfileにより-iファイルに移動されます)。

最後の行は、デフォルトの/dev/stdout出力(この場合)に書き込むのではなく、このコマンドを使用して作成され、削除されます。filewd

その結果、最後の行を除くすべての行が保持され(再記録)、file最後の行は標準出力(ターミナルに接続)として生成されます。

答え2

あなたが要求した質問に対する素晴らしい答えを得ましたが、参考までに「sedを使用してファイルにコマンドを実装する方法」に対する最良の答えはpop「しないでください」です。明確さが不足してすぐに終わらない場合は、この質問に対する回答があれば幸いです。

現在使用しているGNU sedの代わりにGNU awkを使用することは、すべてのシェルで機能し、理解しやすくなります。

$ awk -i inplace 'NR>1{print prev} {prev=$0} END{if (NR) print prev}' file
Line # 7

$ cat file
Line # 1
Line # 2
Line # 3
Line # 4
Line # 5
Line # 6

バラよりhttps://www.gnu.org/software/gawk/manual/gawk.html#Extension-Sample-InplaceGNU awkを使用した「内部」編集に関する追加情報。

関連情報