【问题标题】:String tokenisation algorithm won't tokenise字符串标记化算法不会标记化
【发布时间】:2010-10-07 11:12:47
【问题描述】:

大家早上好, 我正在编写一个 bash 脚本来从给定目录中的所有文件中提取某些 XML 标记的值。我决定通过标记每一行并返回相关标记来做到这一点。问题是它没有正确标记,我不太明白为什么。这是我可以做的最小的例子来重建问题

#!/bin/bash
for file in `ls $MY_DIRECTORY`
do
    for line in `cat $MY_DIRECTORY/$file`
    do
        LOCALIFS=$IFS
        IFS=<>\"

        TOKENS=( $line )
        IFS=$LOCALIFS
        echo "Token 0: ${TOKENS[0]}" 
        echo "Token 1: ${TOKENS[1]}" 
        echo "Token 2: ${TOKENS[2]}" 
        echo "Token 3: ${TOKENS[3]}" 

    done
 done

我猜这个问题与我在一个本身使用 IFS(即 cat 操作)的循环中摆弄 IFS 有关,但这以前从来不是问题。
有什么想法吗?

谢谢, 里克

【问题讨论】:

  • 请给出文件中的示例行并描述输出不正确的原因
  • 这里有很多初学者错误(for i in $(ls),UUOC...)。见bash pitfalls

标签: xml bash token ifs


【解决方案1】:

使用更好的工具来解析 xml,理想情况下它应该是一个解析器,但是如果您的要求很简单并且您知道您的 xml 的结构,那么简单的字符串操作可能就足够了。比如xml文件,你想获取tag3的值

$  cat file
blah
<tag1>value1 </tag1>
<tag2>value2 </tag2>
<tag3>value3
</tag3>
blah

$ awk -vRS="</tag3>" '/tag2/{ gsub(/.*tag3>/,"");print}' file
value3

所以要遍历你的目录

for file in *.xml
do
  value="$(awk -vRS="</tag3>" '/tag2/{ gsub(/.*tag3>/,"");print}' "$file" )"
  echo "$value"
done 

【讨论】:

  • 我冒昧地在你的回答中加上引号,希望你不会被冒犯。
  • 谢谢,但没关系,因为您以后总是可以为“价值”加上引号
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
相关资源
最近更新 更多