2

おそらくviのように?

私のperlの同等物は次のとおりです。

grep -Po '(?<=^.L.........\s).*(?=\s->\s)' rsync_itemized.log

すべてのシンボリックリンクの変更を見つけて、ファイル名の部分を出力します。明らかに、awk を使用できます。

awk '$1 ~ /^.L........./ { print $2 }' rsync_itemized.log

しかし、greps ネイティブ正規表現エンジンがそれをサポートしているかどうか疑問に思っていました。

4

1 に答える 1

1

いくつかのメモ:

  • grep -Pperl互換のコンパイル済みライブラリ (perl ではなく C で記述) である libpcre を使用ます。
  • ファイル名にスペースがあると、コマンドは機能しませawk

このsedコマンドは少しうまく機能します:

sed '/^.L......... /!d; s///; / -> .*/!d; s///'

これにより、最初の正規表現に一致しないすべての行が削除され、残りの行の一致する部分が削除されます。次に、2 番目の正規表現についても同じことが行われ、テキストが途中に残ります。regexps はgreedyであるため、2 番目の正規表現はeven even you wanteda -> b -> cに変わるため、これも完全な解決策ではありません。aa -> b

おそらくperl直接使用できます(libpcreライブラリなしでコンパイルされたシステムを使用しているgrepため、実行できないと思います-Pが、おそらくまだアクセスできますperl):

perl -ne '/^.L.........\s(.*)\s->\s/ and print "$1\n"'

今回は、貪欲さが有利に働き (正規表現は左から右に評価されます)、シンボリック リンクされた という名前のファイルを正しく抽出しa -> bますc

GNUsed (ほぼすべての Linux システム) を使用している場合は、そのロジックを模倣できます。

sed '/^.L.........\s\(.*\)\s->\s.*/!d; s//\1/'

 

しかし、私はあなたの質問に技術的に答えていませgrep-P基本および拡張 POSIX 正規表現(BRE および ERE)grepを使用します。EREでさえ、あなたが探していることを行うことはできません。したがって、簡単な答えは、. 複数のコマンドでそれを実行できるかもしれませんが、それは非常に醜いものであり、ルックアラウンドまたはテキスト置換なしでは実際には実行できないと言いたいのですが、どちらもBREまたはEREでは利用できません.grep-Pgrep

于 2015-12-02T17:55:15.257 に答える