0

「|」があります 区切りテキスト ファイル。2 つのフィールドを結合し、これを同じレコード内の別のフィールド ($5) によって指定された xml ファイルに挿入する必要があります。

awk -F "|" '{print $2$4 >> $5 }' source.txt

これは素晴らしいことですが、ファイルの最後にデータを追加するだけです。<element> blablabla </element> 各xmlにあるコンテンツを置き換えるために必要です。

前もって感謝します

4

3 に答える 3

0

私の理解が正しければ、別のファイルから推定したデータを使用して、各 XML ファイルをその場で変更する必要があります。たとえば、ソース データは次のようになります。

  one|fluffy|slurm|unicorns|animal.xml
  two|yellow|flarn|moons|mineral.xml
  three|blue|jalaroot|stars|mineral.xml

XML ... まあ、例を挙げる必要はありません。<element>各 XML ファイルの を $2 と $4 を連結したものに置き換えたいと考えています。これが正しくない場合は、質問で明確にしてください

ここにオプションがあります。

#!/bin/sh

awk -F'|' '{print $5,$2$4}' source.txt | while read file data; do
  case "$data" in
   *#*) echo "ERROR: invalid data ('$data')" >&2 ;;
   *)   if [ -f "$file" ]; then
            sed -ri -e "s#<element>[^>]+</element>#<element>$data</element>#" "$file"
        else
            echo "ERROR: no such file: '$file'" >&2
        fi
        ;;
  esac
done

ここでの考え方は、データをシェル変数のセットとして取得し$file$dataその後、while ループで各置換をステップ実行するというものです。置換は、sed「インプレース」(-i) を使用して行われます。これを使用する前に、実装のマニュアル ページを読み、sedデータをバックアップしてください。

これは実際には POSIX 互換であり、bash を必要としないことに注意してください。(ただし、bash でも問題なく動作します。)

条件:

  • 現在の状態では、ファイル名に空白が含まれていると失敗します。
  • データに他の XML タグ (例: ">" 文字) を含める必要がある場合は、sed の正規表現を改善する必要があります。( HTML を regex で解析できないという事実にもかかわらず。)
于 2013-09-26T14:01:11.880 に答える
0

これを試すことができますbash

#!/bin/bash

while read line
do 
arr=(${line//|/ })
sed -i.bak "s#<element>.*</element>#<element>${arr[1]}${arr[3]}</element>#g" ${arr[4]}
done < 'source.txt'

テスト :

sat:~# cat source.txt 
projectName|URL|string1|string2|file.xml
projectName|URL|hello1|hello2|sample.xml
sat:~#
sat:~# cat file.xml
<element>xmlcontent</element>
sat:~# 
sat:~# cat sample.xml
<element> content </element>
sat:~#
sat:~# bash sample.sh  # Executing script
sat:~#
sat:~# cat file.xml
<element>URLstring2</element>
sat:~#
sat:~# cat sample.xml
<element>URLhello2</element>
于 2013-09-26T13:30:03.933 に答える
0

サンプルの入力または期待される出力を提供しなかったため、テストされていませんが、これは必要なものに近いはずです。

awk -v pid="$$" '
NR==FNR {
    file = $5
    f2s[file,++numSubs[file]] = $2 $4
    if ( !seen[file]++ )
        ARGV[ARGC++] = file
    next
}
{
    for (i=1; i <= numSubs[FILENAME]; i++)
        gsub(/<element>.*<\/element>/,"<element>" f2s[FILENAME,i] "</element>")
    print > (FILENAME ".mod_" pid)
}
' source.txt

for f in *.mod_$$
do
   mv -- "$f" "${f%.mod_$$}"
done

上記が何をしているのかを考えて、実際のファイルで実行する前に、ファイルのコピーでテストしてください。それはテストされていません。

于 2013-09-26T13:27:32.387 に答える