sed を使用した正規表現およびパイプコマンド

sed を使用した正規表現およびパイプコマンド

コマンドを使うのは本当に難しく、よくsed書かれたチュートリアルも見つからないようです。

私が他の言語(Python、JavaScript、Java)で正規表現を使ったことがあるとしましょう。してはいけない問題になる。

したがって、私の質問は次のようになります(「理論的な」質問とより実用的な質問)。

  1. 正規表現はsedPython / JS / Javaで使用される正規表現とまったく同じですか? BREとEREについて読みましたが、どう違いますか? EREはできません拡大する着替える?

  2. たとえば、パイプ出力から何かを抽出したい場合、sedこれを行う構文は何ですか?

uptime2番目の質問に関する追加情報:sedのパイプ出力があるとしましょう。

uptime | sed ...

uptime次の出力例が与えられたら、18:13 up 5:12, 2 users, load averages: 0,45 0,37 0,402つの別々の数値(時間と分)の形式で単一の稼働時間を解析し、それを時間、分の形式xxhyymxx表示yyしようとしています。

最後に、Pythonで次のことを行います。

hh, mm = re.match(r'\s+ up \s+(\d{1,2}):(\d{1,2})').groups()
print '%sh%sm' % (hh, mm)

答え1

既存のUNIXツールは、BREまたはERE(デフォルトまたは拡張正規表現)をサポートしています。 POSIX は両方ともエンコードします。ウィキペディア彼らは説明した。ほとんどの最新ツールは通常、Perlで最初に導入されたアドイン(と呼ばれる)を使用してEREを拡張します。ポリメラーゼ連鎖反応)。

ERE は BRE の機能を拡張しますが、構文は拡張しません。 BREでは文字に\[.*^$固有の意味があり、一部の演算子(グループ化など)は\(…\)バックスラッシュを使用します。 EREでは、+?|()それも特別で、バックスラッシュの後に英数字以外の文字が続くことは決して特別ではありません。

\dBREにはPython / PCREとはありません。既存のコレクション構造と文字クラスを使用して、isおよびis\s文字セットを表すことができます。二重括弧に注意してください。 1 つは文字セットを表し、もう 1 つは文字クラスを表します。たとえば、「文字、ダッシュ、またはアンダースコア」を使用できます。\d[[:digit:]]\s[[:space:]][-_[:alpha:]]

BREには演算子はありません(BRE構文の拡張として+一部のsed実装でサポートされています)。グループと一致の数には追加のバックスラッシュが必要です。\+X+XX*

したがって、BREに対応するPythonはスペースが\s+ up \s+(\d{1,2}):(\d{1,2})多すぎます[[:space:]][[:space:]]* up [[:space:]][[:space:]]*\([[:digit:]]\{1,2\}\):\([[:digit:]]\{1,2\}\)\s+スペースは、少なくとも2つのスペース文字を意味します。

ssedのコマンドは行を書き換えるため、行全体を一致させる必要があります。保存されたグループに組み合わせた文字列を作成するための別のコマンドはありません。余分な空白を修正すると、Pythonコードスニペットのシミュレーションは次のようになります。

uptime | sed 's/^.*[[:space:]][[:space:]]*up[[:space:]][[:space:]]*\([[:digit:]]\{1,2\}\):\([[:digit:]]\{1,2\}\).*$/\1h\2m/'

Pythonコードスニペットとは異なり、これは最後の一致ではなく最初の一致を抽出しますが、ここでは重要ではありません。

出力にはuptimeスペース文字とASCII番号が必要なため、正規表現を単純化できます。

uptime | sed 's/^.* up  *\([0-9]\{1,2\}\):\([0-9]\{1,2\}\).*$/\1h\2m/'

uptimeこれは、マシンが1日未満で実行された出力とのみ一致します。練習日でマッチング日を残します。 (ヒント:2つの式を作成してくださいsed -e s/AS ABOVE/\1h\2m/ -e 's/EXERCISE/\1d\2h\3m/':)

答え2

各ツールは(ほとんど)独自のREライブラリを使用します。他のバージョンでもsedここで違いを見つけることができます。広く使用されている2つの標準は、多くのツールで許可されているPOSIX標準正規表現(少なくともいくつかのオプションを含む)であり、もう1つの一般的な標準はPCRE(Perl Compatible Regular Expression Library)です。しかし、最後は「一般」REとはかなり異なります...

あなたの場合:

uptime | sed -e 's/^ \([0-9][0-9]\):\([0-9][0-9]\).*$/\1h\2m/'

(Fedora 18、sed-4.2.1-10.fc18.x86_64、GNU sedで試しました)

修正する:文書の量が多い場合、何が問題ですか?GNU sedのホームページ?またはこれ地図時間? GNUの情報文書はsed多少長いが完全である。

関連情報