前の正規表現に一致する行(単一行)に対して正規表現検索を実行します。

前の正規表現に一致する行(単一行)に対して正規表現検索を実行します。

長いテキストファイルの一意の行にある文字列を印刷する必要があります。ファイルの関連行の例long.txt:

Software version 4.0.10, 2002-03-28

必要な文字列は正確です4.0.10

ステップはおおよそ次のとおりです。

  • たとえば、次の正規表現を使用して行を一致させます。/^Software/
  • その行を見つけたら、その行で目的の文字列(他の正規表現)を検索してください。
  • 文字列印刷

sed、またはなどのツールを使用して1行awk(パイプを使用しないでください)でこれを行うにはどうすればよいですかperl

注:実際の正規表現はあまり関係ありません。最も重要なのは、関連するコマンドと構文です。ありがとうございます!

答え1

sedあなたの質問は非常に一般的です。しばらく時間をかけて、そのデザインとそのようなユースケースを処理する方法について説明します。

sedストリームエディタです。ストリーム(パイプ、単一ファイル、または一連のファイル)からテキスト入力を受け入れ、そのテキストストリームに対して操作を実行してテキストを出力します。 (参考としてこれはいいえ元の概念は文書編集のために意図されているか、設計されていますが、しばしばこの目的に使用されます。 )

sed知っておくべき重要な点は次のとおりです。

  • sedテキストを1行ずつ処理します。あなたが提供するコマンドは、基本的に各入力行で動作し(デフォルトで)最後に結果を印刷するループです(デフォルトでは)。
  • コマンドは、sedオプションの条件付きテスト(または「パターン」)と実行するアクションで構成されます。
  • pすべての操作はrint、substitute、deleteなどの単一文字コマンドです。
  • 最も一般的な条件は行に一致する正規表現ですが、行番号を使用することもできます。
  • 範囲指定できます。つまり、すべての行に対して次のことを行います。~から(最初の条件)に従って(2番目の条件)。

持つ非常に詳細なチュートリアルと参考資料sedオンラインで無料でご覧いただけますので、全内容をお読みください。

あなたのシナリオで必要なコマンドは次のとおりです。

sed -n -e '/^Software/{s/,.*//;s/.*[[:space:]]//;p;}' filename

翻訳すると、次のようになります。

  • -nsed各入力行を印刷するデフォルトの動作を抑制します。
  • -e:次のsedコマンドを実行してください。
  • /^Software/{}:この正規表現に一致する行にのみ含まれる次のコマンドセットを実行します。
  • s/,.*//:行の最初のカンマ(およびそれ以降のすべての項目)を削除します。
  • s/.*[[:space:]]//:最後の空白文字まで行のすべての項目を削除します。
  • p:結果テキストを印刷します。

答え2

選択できるいくつかのオプションは次のとおりです。

sed -n 's/Software version \([^,]\+\).*/\1/p' file
awk -F '[ ,]' '$1=="Software" && $2=="version" {print $3}' file
perl -nE '/Software version (.+?),/ and say $1' file
grep -oP '(?<=Software version ).+?(?=,)' file

すべてバージョン文字列にカンマがないとします。

答え3

次のテストバージョンをお試しください。

 awk '{if ($0 ~ /^Software/) {print substr($3,1,length($3)-1)}}' long.txt

各行の3番目の要素を次のように印刷します。ソフトウェア

サブストリング最後の文字 'を削除するために使用されます。' 3番目の要素から始めてください。

テストを受ける:

awk '{if ($0 ~ /^Software/) {print substr($3,1,length($3)-1)}}' long.txt
4.0.10

関連情報