時間の経過とともに変化する可能性のある長い文字列から値を抽出しようとしています。たとえば、文字列は次のようになります
....../filename-1.9.0.3.tar.gz"<....
そして、私が抽出したいのは、ファイル名-の間の値です。 および.tar.gz 、基本的にファイルバージョン(この場合は1.9.0.3)。この方法で行う必要があるのは、後でコマンドを実行する可能性があり、値が1.9.0.6または2.0.0.2、あるいはまったく異なるものになるためです。
これどうやってするの?現在はgrepのみを使用していますが、sed、awk、cutなどの他のユーティリティを使用してもかまいません。完全に明確にするために、文字列のファイルバージョン部分のみを抽出する必要があります。これは、文字列が非常に長いため(両側で)、他のすべてを何らかの方法で切り取る必要があるためです。
承認された回答:
grep -P
を使用 / pcregrep
、前向きな後読みと前向きな先読みを使用する:
grep -P -o '(?<=STRING1).*?(?=STRING2)' infile
あなたの場合、STRING1
を置き換えてください filename-
を使用 およびSTRING2
.tar.gz
を使用
pcregrep
にアクセスできない場合 および/またはgrep
-P
をサポートしていません これは、お気に入りのテキスト処理ツールを使用して行うことができます。 ed
を使用したポータブルな方法は次のとおりです 同じ出力が得られます:
ed -s infile <<IN
g/STRING1/s//
&/g
v/STRING1.*STRING2/d
,s/STRING1//
,s/STRING2.*//
,p
IN
仕組み:各STRING1
の前に改行が追加されます オカレンス(したがって、1行に最大1回オカレンスがあります)、すべての行がSTRING1.*STRING2
と一致しません 削除されます。残りのものについては、STRING1
の間にあるものだけを保持します およびSTRING2
結果を印刷します。