コードの複数のスニペットは、次のようなファイルに存在します。
<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"/>
XMLStarlet (xmlstarlet
だけでなくxml
としてインストールされることもあります)を使用して関連するタグを抽出し、次にsort
とuniq
を使用して重複を見つける:
$ 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 -d
はsort
の出力から重複するエントリを抽出します。
このようなものは私のテストでは問題なく動作します:
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週間で組み合わせることができます。これは単なるテストでした。