Скрипт Bash для чтения текстового файла и вывода каждой строки в переменные - PullRequest
1 голос
/ 13 февраля 2012

У меня есть файл с именем test, который содержит неизвестное количество строк:

<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"

Затем мне нужно обработать массив с помощью сценария do while.

Я искал решение этой проблемы в течение нескольких часов, ноне повезло.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2012

Это может работать для вас:

sed 's/<\([^>]*\)>\([^<]*\)<\/\1>/&\n/g' file |
sed '/^\s*$/d;s/<\([^>]*\)>\([^<]*\)<\/\1>/\1="\2"/'
label="blogname"
type="string"
label="blog description"
type="text"
0 голосов
/ 13 февраля 2012

Следующий код никогда не должен использоваться. Это решает проблему, но 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

Редактировать: еще одна версия, вдохновленная комментарием perelman

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...