2012-04-27 7 views
0

私は異なるテキスト行を持つファイルを持っています、私は同じパターンの重複しているかどうかをチェックしたいと思います。文字列のパターンを見つけるLinux

ファイルで:

Blah 
Blah 
Depends: ssloader, firmware (>= 3.0), firmware (<= 6.0), apta 
blah 

私の目的は、ファイルに "> = 3.0" & "< = 6.0" を取得することです。時には1つの "ファームウェア"依存性しかないことに注意してください。私は、同じ行に複数の1つのパターンがありますかどうかを確認する方法を知りたい

if grep -Fq "firmware (" inputfile #checks if pattern exists 
then 
compat=$(look 'Depends:' inputfile) #grab line where pattern is 
compat=${##*firmware (} #remove pattern and other stuff infront 
compat=${compat%%)*} #remove other stuff behind ")" 
echo $compat >> outputfile 
fi 

:私はこれまでのところ、唯一の第一ファームウェア情報をつかむている何

。または、同じパターンの1行以上がある場合、その行を識別する方法でファームウェア値を取得することができます。おかげ

EDIT:

私の当初の意図は、同じパターンの2つ以上が存在するかどうかを検出することです。私はアイデアを公開しています。このような:)

何か:

if (more than one of same pattern) 
get both values #I am open to ideas to get this done <--- 
else 
get value of this pattern 
fi 

EDIT2:

私はこのようにそれをすることによって、この作業を持っています。

if grep -Fq "firmware (" ./control 
then 
    compat=$(look 'Depends:' control) 
    compat=${compat#*firmware (} 
    compat=${compat%%)*} 
    echo -n $compat > ./compatibility.txt 
    if [ $(grep -o "firmware (" ./control | wc -l) -eq 2 ]; then 

    compat=$(look 'Depends:' control) 
    compat=${compat##*firmware (} 
    compat=${compat%%)*} 
    echo " $compat" >> ./compatibility.txt 
    fi 
fi 

私はそれが間違いなく非常に素人であることを知っており、パターンが「従属:」ラベルにある場合にのみ機能します。

アイデア/入力はありますか?

+0

それは常に 'firmware'されようとしている、またはあなたが'依存のいずれかの重複を探しています: '、またはラベル付きの行に重複はありますか? – geekosaur

+0

また、繰り返し数はいくつありますか? – geekosaur

+0

時には 'ファームウェア 'になることがあるので、' Pre-depends: 'のような他のラベルは' firmware'情報を持っているかもしれません。 – AlwynIsPat

答えて

1

それはsedを使用するために大丈夫だ場合:

sed -n '/firmware (/ { s/[^(]*(\(\([<>]=\|=\|[<>]\)\s\+[0-9]\+\(\.[0-9]\+\)*\))[^(]*/\1 /g; p }' file 

サンプル入力:

Blah 
Blah 
Depends: ssloader, firmware (>= 3.0), firmware (<= 6.0), firmware (= 5.0), apta 
Depends: ssloader, firmware (>= 3.0), firmware (<= 6.0), apta 
Depends: ssloader, firmware (<= 6.0), apta 
blah 

サンプル出力:

>= 3.0 <= 6.0 = 5.0 
>= 3.0 <= 6.0 
<= 6.0 
+0

私は本当にこれが好きですが、「ファームウェア」の価値しか取らないように強化することができますか? '依存する:ssloader、ファームウェア(> = 3.0)、subr(0.222-1)、ファームウェア(<6.0)、apta'。 'ファームウェア(> 6.0)'の場合は動作しますか?( '='がないことに注意してください) – AlwynIsPat

+0

@AlwynIsPat私の編集を参照してください。私はそれを短くするためにgsed拡張子のカップルを使用したので、あなたがgsedを持っていないかどうか知らせてください、そして、私は長いバージョンを使用します。 –

1

何に応じて、より良い仕事かもしれないもう一つのsedバージョン、やっている:

sed -n 's/.* firmware (\([^)]*\)),.* firmware (\([^)]*\)),.*$/\1 \2/p' 

(仕方によって、複数のパッケージにこれを一般化することは比較的容易である。)

+0

'。*'を取り除くと 'firmware * 'のインスタンスが1つしかないと失敗します。'。* 'を取り除くと、2番目のオプションをオプションにすることができます。 –

+0

"複数のパターン "それは何ですか?(質問は繰り返し情報を探しているようです) – geekosaur

+0

うん、おそらくそうです。私はsedで '\ {1,2 \}'を意味する "最も反復する"また、彼らのプログラムはすでに1つのケースに対応しているようですが、2つまで対応できるようにしたいと考えています。 –

関連する問題