我有一个“|”分隔的文本文件。我需要组合2个字段,然后将其插入到同一记录中另一个字段($ 5)给出的xml文件中。
awk -F "|" '{print $2$4 >> $5 }' source.txt
这样做很棒,但它只是将数据附加到文件的末尾。我需要它来替换{{1}}的内容 它位于每个xml中。
提前致谢
答案 0 :(得分: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
考虑上面的操作并在文件副本上对其进行测试,然后再在真实文件上运行。它没有用。
答案 1 :(得分: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>
答案 2 :(得分:0)
如果我理解正确,您希望使用从其他文件推断的数据就地修改每个XML文件。例如,源数据可能如下所示:
one|fluffy|slurm|unicorns|animal.xml
two|yellow|flarn|moons|mineral.xml
three|blue|jalaroot|stars|mineral.xml
XML ......好吧,我不需要提供一个例子。我想收集你想要用$ 2和$ 4连接替换每个XML文件中的<element>
。如果这不正确,请clarify it in your question。
所以这是一个选择。
#!/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
这里的想法是我们将数据作为一组shell变量$file
和$data
,然后在while循环中逐步执行每个替换。使用sed
“就地”(-i)完成替换。阅读sed
实施的手册页,并在尝试使用之前备份数据。
请注意,这实际上与POSIX兼容,并且不需要bash。 (虽然它也适用于bash。)
附带条件: