web-dev-qa-db-ja.com

ファイル内のタグの重複インスタンスを探しています

コードの複数のスニペットは、次のようなファイルに存在します。

<blah>Spread the peanut butter <ramout assot="f0123_fun10" bapel="2 or 6"/> on good looking bread <ramout assot="f0123_fun10" bapel="3 or 5"/> that does not have peanut butter <ramout assot="f0123_fun10" bapel="2 or 6"/> already on the bread this that and the other <ramout assot="f0123_fun10" bapel="4"/> with something else.</blah>

単一のファイルでramoutタグの重複するインスタンスを見つけようとしています。以下が存在する場合:

<ramout assot="f0123_fun10" bapel="2 or 6"/> 

開始タグと終了タグ内で再び繰り返されるかどうかを知りたいです。

私は複数のことを試しましたが、最新のものの1つは次のとおりです。

grep -Eoi '<blah>.*([[:space:]]<ramout assot).*\1.*</blah>' *.xml | less

何も返されませんでした。

私も試しました:

 grep -Eio '<blah>.*([[:space:]]<ramout assot="[a-z][0-9]{5}_fig[0-9]+" bapel="[0-9]+.*)' *.xml

これには後方参照は含まれていませんが、すべての結果が表示されるわけではありません。これは、1行の結果のみを示しているようです(複数行にまたがらないでください)。

1行にある場合とない場合があるものを検索する場合、sedを使用する必要がありますか?

Awkは実行可能な候補ですか?私は見てみました:awk '/ Start pattern /、/ End pattern /' filenameはより多くの結果を返しましたが、それでもすべての結果が得られていません。

A)ファイル全体のすべての結果と個別にb)blahタグ内で重複しているすべての結果を見つけることができる助けがあれば幸いです。

期待される結果は次のようになります。

検索結果a)すべてのramout結果を表示:

<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="3 or 5"/>
<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="4"/>

検索の結果b)重複する結果を表示すると、次のように表示されます。

<ramout assot="f0123_fun10" bapel="2 or 6"/>
3
regexnoob

XMLStarletxmlstarletだけでなくxmlとしてインストールされることもあります)を使用して関連するタグを抽出し、次にsortuniqを使用して重複を見つける:

$ xml sel -t -m '/blah/ramout' -c '.' -nl test.xml | sort | uniq -d
<ramout assot="f0123_fun10" bapel="2 or 6"/>

xmlコマンドは、<ramout>タグのすぐ下にあるすべての<blah>タグと一致し、これらのそれぞれについて、タグの後に改行を標準出力にコピーします。

sortはソートし、uniq -dsortの出力から重複するエントリを抽出します。

2
Kusalananda

このようなものは私のテストでは問題なく動作します:

awk -F"/>" -v RS="<ramout assot=" 'NR>1{print RS $1 FS}' file1

echo "Finding Cuplicates:"
awk -F"/>" -v RS="<ramout assot=" 'NR==1{next}seen[$1]++==1{print RS $1 FS}' file1

<ramout assot="f0123_fun10" bapel="2 or 6"/> 
<ramout assot="f0123_fun10" bapel="3 or 5"/> 
<ramout assot="f0123_fun10" bapel="2 or 6"/>
<ramout assot="f0123_fun10" bapel="4"/> 
Finding Cuplicates:              
<ramout assot="f0123_fun10" bapel="2 or 6"/>  

ここでオンラインでテストしてください

Awk機能を利用して、カスタムレコードセパレーター(RS)とカスタムフィールドセパレーター(FS)を宣言します。上記の2つのコマンドは、1週間で組み合わせることができます。これは単なるテストでした。

0
George Vasiliou