bash脚本读取一个文本文件,然后输出每行到变量

问题描述:

我有一个名为test的文件,其中包含线的未知数量:bash脚本读取一个文本文件,然后输出每行到变量

<label>blogname</label><type>string</type> 
<label>blog description</label><type>text</type> 

我想用SED或AWK读取该文件并将每个标签和每个类型存储到一个单独的变量中,或者更好地存储到数组中。

将输出标签的内容在文件中这个例子:

awk -vRS="</variable>" '/<variable>/{gsub(/.*<variable>/,"");print}' test >result 

但我需要每一行的内容,并通过每个标签的内容分开他们给我这样的:

label="blogname" 
type="string" 

我然后需要用脚本处理数组。

我一直在寻找一个解决方案,这几个小时,但没有运气。

+0

你也许可以写一个'awk'脚本输出与线该标签后跟一个带有类型的行,并在bash的'while'循环中使用'read'将值放入数组中。查阅'read'和bash数组。 – perelman 2012-02-12 21:22:05

下面的代码不应该真的被使用。它解决了这个问题,但是一个bash脚本实际上并不是你想用于这样的任务。

#!/bin/sh 
while read line; do 
    label=`echo $line | sed -n 's|^.*<label>\(.*\)</label>.*$|\1|p'` 
    type=`echo $line | sed -n 's|^.*<type>\(.*\)</type>.*$|\1|p'` 
    echo "label:" $label 
    echo "type:" $type 
    echo 
done 

编辑:另一个版本通过佩雷尔曼灵感来自评论

#!/bin/sh 
sed -n 's|^<label>\(.*\)</label><type>\(.*\)</type>.*$|\1\n\2|p' | while read label; do 
    read type 
    echo "label:" $label 
    echo "type:" $type 
    echo 
done 
+0

提供的解决方案是伟大的,但我试图添加第三个变量,但它似乎并没有工作 – user1205654 2012-02-12 23:26:38

这可能会为你工作:

sed 's/<\([^>]*\)>\([^<]*\)<\/\1>/&\n/g' file | 
sed '/^\s*$/d;s/<\([^>]*\)>\([^<]*\)<\/\1>/\1="\2"/' 
label="blogname" 
type="string" 
label="blog description" 
type="text"