web-dev-qa-db-ja.com

ディレクトリ内のすべてのxmlファイルで特定のタグを再帰的に検索し、タグの値をgrepします

Ubuntu 14.04 Trusty Tahr。

何百ものxmlファイルを含む「testmag」というディレクトリと、多数のxmlファイルを含むディレクトリがあるとします。 XMLファイルの名前はわかりませんが、そのうちの1つにタグ<dbname>....</dbname>が含まれています。

前述のタグを含むファイルを見つけて、ターミナルの出力としてタグの値をgrepする方法

2
Vicky Dev

これは、一致を含むファイルのファイル名も出力するfindを使用したソリューションです。

_find . -name "*.xml" -exec grep '<dbname>' {} \;             \
                     -exec echo -e {}"\n" \;                 \
                     | sed 's/<dbname>\(.*\)<\/dbname>/\1/g'
_

説明

  1. _find . -name "*.xml"_現在のディレクトリから再帰的にすべてのxmlファイルを検索します
  2. _-exec grep '<dbname>' {} \;_パターンごとのファイル検索ごとに_<dbname>_
  3. _-exec echo -e {}"\n" \;_エコーファイル名+改行(_-e_オプションは、echoに_\n_を解釈させます)
  4. | sed 's/<dbname>\(.*\)<\/dbname>/\1/g'パイプ出力をsedにパイプして、_<dbname></dbname>_タグの間に含まれるフィールドのみを出力します。

注1:_echo -e ..._で出力をフォーマットして、各ファイルの結果を明確にレイアウトできます。必要に応じて、新しい行またはアンダースコアの行を追加します。

注2:各ファイルへのパスは_._に相対的に与えられます(例:_./subfolder1/file.xml_)。絶対パスが必要な場合は、_find $PWD -name ..._を使用してください。

3
Valentin B.

これらのファイルを含むディレクトリXMLSがあるとします。

cat XMLS/file1
foo bar <dbname>target</dbname> baz
foo foo

cat XMLS/file2
<name>notarget</name>

私はこのコマンドを使用します:

grep -r '<dbname>' XMLS/ | sed 's/.*<dbname>\(.*\)<\/dbname>.*/\1/'
target

ご覧のとおり、これは<dbname>タグ内の値を返します。 <name>タグ内の値ではありません。


grep-rフラグは再帰的に検索します。

sedは、値targetを除くすべての文字列を取り除きます。

1
maulinglawns

適切なXMLパーサーを使用してXMLを解析する:

shopt -s globstar nullglob
for file in **/*.xml; do 
    dbname=$(xmlstarlet sel -t -v '//dbname' "$file")
    [[ -n "$dbname" ]] && printf "%s\t%s\n" "$file" "$dbname"
done
0
glenn jackman