長いテキストファイルの一意の行にある文字列を印刷する必要があります。ファイルの関連行の例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、s
ubstitute、d
eleteなどの単一文字コマンドです。- 最も一般的な条件は行に一致する正規表現ですが、行番号を使用することもできます。
- ㅏ範囲指定できます。つまり、すべての行に対して次のことを行います。~から(最初の条件)に従って(2番目の条件)。
持つ非常に詳細なチュートリアルと参考資料sed
オンラインで無料でご覧いただけますので、全内容をお読みください。
あなたのシナリオで必要なコマンドは次のとおりです。
sed -n -e '/^Software/{s/,.*//;s/.*[[:space:]]//;p;}' filename
翻訳すると、次のようになります。
-n
:sed
各入力行を印刷するデフォルトの動作を抑制します。-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