この「sed」コマンドを私に説明して改善するのに役立ちますか?

この「sed」コマンドを私に説明して改善するのに役立ちますか?

私はコマンドラインを見つけましたが、正確に何が起こっているのかわかりません。

pdftk $1 dump_data | sed -e 's/\(InfoValue:\)\s.*/\1\ /g'

この行では、コマンドはsed私の主な疑問です。どうしたの?

私はこの部分が初めてで、この部分では*/\1\コマンドがsed呼び出されていると思うので、$1変更したらコマンドを$1変更する必要があります。sedたぶん、次のようなものがあります。

pdftk out dump_data | sed -e 's/\(InfoValue:\)\s.*/\out\ /g'

しかし、理論を理解していないので、sed仮説を確信できません。

答え1

いいえ、このsedコマンドはパイプ移行コマンドと直接関連しません。このsedコマンドは標準入力からのデータのみを受け入れます。これは理論的な質問ではなく、sedシェルスクリプトの基本原則です。

  1. pdftk $1 dump_data2つの引数を使用してpdftkバイナリ(人気のPDF操作プログラム)を呼び出します。最初の引数は、シェルスクリプトの最初の引数として入力することです。 2番目のパラメータpdftkはcommandですdump_data

  2. 最初のコマンドの出力は、|代替パイプ(記号)を介して2番目のコマンドに直接接続されますsed

  3. InfoValue:空白文字とその他の文字が続く文字列の発生 - ドット\sはすべての文字を表し、アスタリスクは反復回数、一致回数を表します。ただし、置換には最初の部分(バックスラッシュの括弧のペア)だけがあり、その後に白い部分があります。最後のバックスラッシュの後に何が来るべきかは実際には明確ではありません。 Final はg「すべてのアイテムを交換」を意味します。

答え2

... | sed -e 's/\(InfoValue:\)\s.*/\1\ /g'

このs/pattern/replacement/gコマンドは、一致するすべての項目を検索します。模様オンラインにして次のものに交換してください。代替。左側の部分は、\(InfoValue:\)\s.*リテラル文字列InfoValue:(括弧によるキャプチャ)、空白(\sおそらくPerlのGNUismからのもの)、および.*行末までのすべての項目()と一致することです。置換の参照はキャプチャさ\1れた最初のグループ(ここでは唯一のグループ)であり、スペースは文字通りのスペースです。キャプチャグループはリテラル文字列と一致するため、実際にキャプチャする必要はなく、同じ文字列を右側で繰り返すことができます。しかし、そうすると、不要な重複が確実に排除されます。

したがって、埋め込まれた行から後ろInfoValue:のすべての項目を削除します。

sedsedパイプが実行する操作なので、これはパイプから読み取った入力です。sed標準入力から読み取る(ファイル名が指定されていない場合)、パイプは左コマンドの標準出力を右コマンドの標準入力に接続します。コマンド。

$1右側にあるのはそれと全く関係ありませんsed。スクリプトの最初のコマンドライン引数を参照するシェル引数。 (またはそこで使用されている場合はシェル機能)。スクリプトの一部である場合は、次のwhatever.sh somefile.pdfように実行する必要があります。pdftkdump_data操作 与えられたファイルに。

関連情報