5

これが私がやりたいことです:

ドキュメントでRegExを含むパターンを検索し、この正確なパターンが行内に2回存在するかどうかを確認します。

Content of file.xml:
(some code) "testen"  (more code)  >testete<
(some code) "bleiben" (more code)  >bleiben<
(some code) "stehen"  (more code)  >stand<
(some code) "hängen"  (more code)  >hängten<
... 

ここで.*en、(正確に)同じ単語が行に2回出現するかどうかを確認します。したがって、結果は次のようになります。

bleiben

Testen!= testete、stehen!= Stand、hängen!=hängten

これを行う方法はありますか?

4

5 に答える 5

7

greppattern: を使用して、最初の行.*en.*enでこの検索を処理できます。

grep .*en.*en your_file

enこれにより、 2 回出現する行のみが出力されます。

2 つの連続した で処理する必要がある場合grepでも、この同じコマンドをパイプ バージョンで使用できます。

grep .*en your_file | grep .*en.*en

また、同じ行でインスタンスの数を増やしたい場合は、grep-Pオプションを利用して Perl 正規表現を使用できます。

grep -P "(.*en){2}" your_file

{2}これにより、1 行に表示したいインスタンスの数を変更するだけで動作するはずです。

EDIT (まったく同じ単語が2回ある行を見つけるため)

単語の境界を定義できる拡張パターンがなければ、これは困難です。出力例はあまり役に立ちません。わかりやすい例を挙げると、「単語」は.a-zで終わる任意のアルファベット文字列であると想定できenます。必要に応じて、この境界をカスタマイズできます。

grep -P "([a-z]+en).*\1" your_file

enこれにより、行のどこかで見つかった で終わる単語を持つ行 ( \1) が出力されます。

上記の単語境界の問題に関連する注意事項が 1 つあります。「bleiben」と「bleiben」の文脈では、それらは同等です。ただし、「ben」と「bleiben」のコンテキストでは、このパターン一致します。これは、一致するパターンとして「bleiben」から「ben」で終わることがわかるためです (したがって、「ben」 = 「ben」を使用します)。これが受け入れられない場合は、より厳密な単語境界を確立する必要があります (つまり、特殊文字を許可しない?)。

于 2012-09-29T04:24:54.733 に答える
1

sedの使用:

sed -rn 's/.*\b(\w+en)\b.*\b\1\b.*/\1/gp' input_file
于 2012-09-29T05:07:19.643 に答える
1

を使用する 1 つの方法を次に示しGNU awkます。2回とは、2回以上という意味だと思います。次のように実行します。

awk -f script.awk file.xml

の内容script.awk:

/.*en/ { 
    gsub(/["<>]/, " ")
    for (i=1; i<=NF; i++) {
        if ($i ~ /.*en/) {
            array[$i]++
        } 
    }
}
{
    for (j in array) {
        if (array[j]>=2) {
            print j
        }
    }
    delete array
}

または、ここにワンライナーがあります:

awk '/.*en/ { gsub(/["<>]/, " "); for (i=1; i<=NF; i++) if ($i ~ /.*en/) array[$i]++ } { for (j in array) if (array[j]>=2) print j; delete array }' file.xml
于 2012-09-29T04:58:11.673 に答える
0

grep の-oオプションを使用して、行の一致する部分のみを返すことができます。

awk が仕事に適したツールである可能性があることを示唆するリンクは次のとおりです。

于 2012-09-29T04:35:16.457 に答える
0

sedの使用

sed -n  's/[^"]\+"\([^"]\+\)"[^>]\+>\1</\1/p' FileName.txt

出力:

bleiben
于 2012-09-29T10:31:08.953 に答える