xmllintを使用してXMLを解析し、出力をカスタマイズする

xmllintを使用してXMLを解析し、出力をカスタマイズする

次のスキーマを含む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

おすすめ記事