0

次の行を含む random.html というファイルがあります(唯一の行ではありません):

blahblahblahblah random="whatever h45" blahblahblahblah

具体的には何でも取得したいので、これまでのところ次を使用しました:

egrep -o 'random="([a-z]*[A-Z]*[0-9]*[ ]*)+'

これは私に与えますrandom="whatever h45

egrep -o ="([a-z]*[A-Z]*[0-9]*[ ]*)+'これは私の唯一の行ではなく、不要な行があるため、最初から使用することはできません。ランダム キーワードは区別のために重要です。次のような二重の egrep -o を実行しようとしました。

egrep -o 'random="([a-z]*[A-Z]*[0-9]*[ ]*)+' | egrep -o '="([a-z]*[A-Z]*[0-9]*[ ]*)+'

表示されるだけ="whatever h45で機能しない場所。私は何か間違ったことをしていますか、それともこれは違法ですか? 派手なものは使いたくないし、カットも使いたくない。これは非常に「基本的」であるはずです。

4

3 に答える 3

2

これは、bash単独でも実行できます。

while read -r; do
    [[ $REPLY =~ random=\"([a-zA-Z0-9]+) ]] || continue
    echo ${BASH_REMATCH[1]}
done < file.txt

ご使用のバージョンがgrepPerl正規表現をサポートしている場合は、ルックバックアサーションを使用して、に続くテキストのみを照合できますrandom="

grep -P -o '(?<=random=\")([a-zA-Z0-9]+)' file.txt
于 2013-02-17T16:14:46.760 に答える
1

間違ったツールを使用しているだけです。これは awk では簡単です。さまざまな解決策がありますが、ここではその 1 つを示します。

$ cat file
blahblahblahblah random="whatever h45" blahblahblahblah

$ awk 'match($0,/random="([a-z]*[A-Z]*[0-9]*[ ]*)+/) { print substr($0,RSTART+8,RLENGTH-8) }' file
whatever h45

あなたの質問からは、文字列の他の部分を印刷したいのか、または印刷したいのかが明確ではなかったwhateverのでwhatever h45="whatever h45最も可能性が高いと思われるものを選んだ. どっちにしろ些細なことだ…

ちなみに、あなたの正規表現は意味がないようです。あなたの質問からコピーして、あなたが持っていたものと awk ソリューションとの対比を容易にしました。表現する意味を言葉で教えていただければ、正しく書くことができますが、最も可能性が高いのは、二重引用符ではなく、次のようにすることです。

$ awk 'match($0,/random="[^"]+/) { print substr($0,RSTART+8,RLENGTH-8) }' file
whatever h45
于 2013-02-17T11:31:33.680 に答える
0

完全性のための Perl ソリューション。

#% perl -n -e 'print $1, "\n" if m!random="(\S+)!' tt

与える

whatever
whatever

どこttですか

#% cat tt

blahblahblahblah random="whatever h45" blahblahblahblah
blahblahblahblah random="whatever h45" blahblahblahblah
于 2013-02-17T14:38:49.873 に答える