次のスキーマを含むxmlファイル(input.xmlなど)があります。
<?xml version="1.0"?>
<TagA>
<TagB>
<File Folder="FOLDER1M\1" File="R1.txt" />
</TagB>
<TagB>
<File Folder="FOLDER1M\2" File="R2.txt" />
</TagB>
<TagB>
<File Folder="FOLDER2M\1" File="R3.txt" />
</TagB>
</TagA>
このファイルを解析し、出力を別のファイルに書き込む必要があります。必要な出力は次の形式でなければなりません。
www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\1\R3.txt
私がこれまでに得たものは次のとおりです。
echo 'cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]' | xmllint --shell input.xml | grep '=' > xml_parsed
これは私に次の形式のo / pを提供します。
/ > cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]
Folder="FOLDER1M\1"
File="R1.txt"
Folder="FOLDER1M\2"
File="R2.txt"
Folder="FOLDER2M\3"
File="R3.txt"
現在の出力の代わりに希望の出力を取得するにはどうすればよいですか?
答え1
これは一つの方法です。簡単にテストできるように、出力をexample.txtというファイルに入れました。 echoコマンドの最後に私のコマンドを追加するだけです。
サンプル.txt
Folder="FOLDER1M\1"
File="R1.txt"
Folder="FOLDER1M\2"
File="R2.txt"
Folder="FOLDER2M\3"
File="R3.txt"
注文する
% cat sample.txt | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/'
コマンド分解
2行ずつすべてを合わせる
# sed 'h;s/.*//;G;N;s/\n//g'
Folder="FOLDER1M\1"File="R1.txt"
Folder="FOLDER1M\2"File="R2.txt"
Folder="FOLDER2M\3"File="R3.txt"
フォルダを削除=&"
# sed 's/Folder=\|"//g'
FOLDER1M\1File=R1.txt
FOLDER1M\2File=R2.txt
FOLDER2M\3File=R3.txt
File=を '\'に置き換えます。
# sed 's/File=/\\/'
FOLDER1M\1\R1.txt
FOLDER1M\2\R2.txt
FOLDER2M\3\R3.txt
www.xyz.comを挿入してください。
# sed 's/^/www.xyz.com\\/'
www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\3\R3.txt
編集#1
OPは、出力の最初の行を削除するために私の答えを修正する方法を尋ねる質問を更新しました。たとえば、次のようになります。
/ > cat /TagA/TagB/File/@*[name()="Folder" or name()="File"]
...
...
私はこれを使って、grep -v ...
次のような無関係な行をフィルタリングできると彼に言いました。
% cat sample.txt | grep -v "/ >" | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/'
または、ビット全体をファイルに書き込むには、次のようにします。
% cat sample.txt | grep -v "/ >" | sed 'h;s/.*//;G;N;s/\n//g' | sed 's/Folder=\|"//g' | sed 's/File=/\\/' | sed 's/^/www.xyz.com\\/' > /path/to/some/file.txt
答え2
xmllint
これに使用するのは難しいでしょう。
使用xmlstarlet
:
xmlstarlet sel -t \
-m '//TagB/File' \
-v 'concat("www.xyz.com", "\", @Folder, "\", @File)' \
-nl file.xml
またはコマンドラインにウェブサイトのアドレスを安全に提供するには、
thesite=www.xyz.com
xmlstarlet sel -t --var site="'$thesite'" \
-m '//TagB/File' \
-v 'concat($site, "\", @Folder, "\", @File)' \
-nl file.xml
TagB/File
まず、ドキュメント内のすべてのノードセットを選択し、各ノードの文字列をwww.xyz.com
属性値Folder
と属性値File
(\
間に区切り文字を含む)に関連付けます。これにより、-nl
関連付けられた値の後に改行文字が表示されます。
問題のXML文書の出力を提供します。
www.xyz.com\FOLDER1M\1\R1.txt
www.xyz.com\FOLDER1M\2\R2.txt
www.xyz.com\FOLDER2M\1\R3.txt