
sed
次のコマンドがどのように機能するかを知りたいです。
sed -nre "/jar$/ { x; d; }; /class$/ { x; p; }
実際に与えられたjarファイルのリストから特定のクラスファイルを見つけることは別のコマンドの一部です。
find . -name "*jar" -print -exec jar -tf '{}' \; | grep -E "jar$|CLASS_NAME" | sed -nre "/jar$/ { x; d; }; /class$/ { x; p; } "
答え1
まず、コマンドラインオプションから始めましょう。
-n
バッファの正常な出力をディセーブルにします。印刷を要求された行のみを印刷します(たとえば、p
コマンドを使用)。-r
拡張正規表現の有効化-e
ファイルではなくコマンドラインでsedコマンドを指定するときは、実際には必要ありません。
これでsedコマンドが出ます。;
文字で区切られた2つがあります。 Sed は、2 つのコマンドを 1 行ずつ順番に実行します。ただし、一致する場合にのみ可能です。ここでは、両方のコマンドを前に付けます。/SOMETHING/
つまり、現在の行が正規表現と一致する場合にのみコマンドが実行されますSOMETHING
。
/jar$/
regexpは現在の行と一致しますjar
。同様の/class$/
正規表現は現在の行と一致しますclass
。特定の行が一致すると、その中の2つのコマンドが実行されます(グループ化されています{}
)。最初のケースではx
、次のd
コマンド。 2番目のケースでは注文されx
ますp
。
x
コマンドはですeXchange
。sed
一部の行を格納するために使用できるバッファがあります。このコマンドはこのバッファを現在の行と交換します(したがって、現在の行がこのバッファに入り、バッファの内容が現在の行になります)。d
このコマンドは現在の行を破棄し、新しい行を読み取り、最初の行から始めてsedコマンドを実行します(d
現在の行以降のすべてのコマンドは無視されます)。p
このコマンドは現在の行を印刷します。コマンド引数を使用しているため、-n
印刷された行だけが出力p
に表示されます。
結論として:
/jar$/ { x; d; }
表現 - 現在の行がで終わるとjar
バッファに保存されます。/class$/ { x; p; }
意味 - 現在の行がで終わる場合は、class
バッファの内容を取得し、(すでにjar
終わっているファイルがない限り終わる最後の行を含める必要がありますclass
)、印刷します。