sedに「詳細モード」または「デバッグモード」を適用する方法はありますか?

sedに「詳細モード」または「デバッグモード」を適用する方法はありますか?

gnu sed実行した内容と完了した内容を詳細に表示する方法はありますか?
スクリプトが実行される前と後に、各入力行に予約されたスペースやパターンスペースなどの内容を表示できるように、「デバッグモード」などが必要です。

答え1

〜のようにプラサン 言及する、GNUのsed導入--debugたとえば、次を実行すると、バージョン4.6のオプションがほとんど必要です。

printf '%s\n' one two  | sed --debug 'H;1h;$x;$s/\n/_/g'

出力は次のとおりです

SED PROGRAM:
  H
  1 h
  $ x
  $ s/\n/_/g
INPUT:   'STDIN' line 1
PATTERN: one
COMMAND: H
HOLD:    \none
COMMAND: 1 h
HOLD:    one
COMMAND: $ x
COMMAND: $ s/\n/_/g
END-OF-CYCLE:
one
INPUT:   'STDIN' line 2
PATTERN: two
COMMAND: H
HOLD:    one\ntwo
COMMAND: 1 h
COMMAND: $ x
PATTERN: one\ntwo
HOLD:    two
COMMAND: $ s/\n/_/g
MATCHED REGEX REGISTERS
  regex[0] = 3-4 '
'
PATTERN: one_two
END-OF-CYCLE:
one_two

どのディストリビューションを使用しているかわかりませんが、このバージョンのsed(またはそれ以上)を使用できます。Debian 10 でUbuntu 19.04からそしてデリバティブはFedora 33で利用可能です。

答え2

個人的には、sedで「詳細な出力」と考えること、つまり「sedが実行するアクション」を取得するのは少し面倒です。

引数を省略すると、-i編集された結果ストリームはコンソールに直接印刷されます。入力ファイル/ストリームが長い、過度の編集、またはマイナーな編集を実行している場合、これはあまり役に立ちません。

Stephenが指摘したように、--debugオプションは次のように伝えます。すべてsedがやっています。つまり、各入力行を印刷して、ファイル行で実行されたすべてのコマンド、そのコマンドの結果、および編集された行を通知します。私の経験ではあまりにも冗談です。私は通常内部の検索と交換にsedを使用します。 1450行ファイルで単一の正規表現置換を実行すると、約8700行の出力が生成されます。かなりおなじみで読む価値があります。しかし、創造的なgrepを使用すると、より多くの情報を得ることができます。

正規表現の検索と置換の場合、次のことが非常に便利です。

sed --debug -e 's/pattern/replacement/' file.txt | grep -B 3 -A 4 -P '^MATCHED'

正規表現コマンドが一致するたびに、デバッグ出力は「MATCHED」で始まる行を印刷します。これは、各一致の8行の4行目で、sedが行ったことを示します。したがって、includeは-B 3 -A 4sedが実際に変更した行グループのみを印刷し、変更されていないすべての入力行に対して8行を印刷しません。

明らかに、正規表現の置換に加えてsedを使用して他の操作を実行できるため、ユースケースやコマンドに合わせて変更する必要がありますが、このアプローチを使用すると、出力を--debugより便利なコンテンツに減らすことができると思います。つまり、cp、mvなどの他のユーティリティに基づく詳細なフラグが必要です。

関連情報