BASH:将数据附加到文件末尾以外的位置

时间:2013-09-26 11:43:49

标签: bash unix awk pipe stdout

我有一个“|”分隔的文本文件。我需要组合2个字段,然后将其插入到同一记录中另一个字段($ 5)给出的xml文件中。

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

这样做很棒,但它只是将数据附加到文件的末尾。我需要它来替换{​​{1}}的内容 它位于每个xml中。

提前致谢

3 个答案:

答案 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。)

附带条件:

  • 在当前状态下,如果文件名包含空格,则会失败。
  • 如果数据必须包含其他XML标记(即“&gt;”字符),那么应该改进sed中的正则表达式。 (尽管你是can't parse HTML with regex。)