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