Можно использовать php кодирование интерфейса командной строки в сценариях удара для обработки нескольких сложных сценариев, которые на самом деле охватывают по нескольким строкам кодирования. Во-первых, попытайтесь сделать свое решение с помощью Сценариев PHP и затем позже передать параметры с помощью режима CLI. Таким образом можно получить контроль над превосходными использованиями синтаксических анализаторов XML.
Среда кажется, что можно использовать PHP в клиентском режиме через ssh/shell доступ.
php -f yourxmlparser.php
Теперь, сделайте все вещи в своем php файле. Используйте параметры командной строки, которые это может взять.
Можно даже присвоить, это возвращает значения к Среде оболочки для продолжения отдыха сценариев оболочки.
И другой путь состоит в том, чтобы использовать |grep опцию соответствовать Вашему необходимому значению в рамках XML-файла, если Вы вполне уверены в структуре своего XML-файла, который не изменяется со временем.
Чтобы сделать то, что, как я думаю , вы пытаетесь сделать, то есть считывать каждое разделенное запятыми поле в true_pairscore.txt
в переменную массива, в вашем коде нет ничего плохого. $ (
в начале строки IFS
, очевидно, неверен и может вызвать ошибку в сценарии (возможно, это причина того, что вы не получаете вывода). главное исправление для вашего кода - просто удалить кавычки вокруг $ line
, поскольку вы хотите, чтобы bash
выполнял разбиение слов вокруг IFS
(обычно это то, что вы используйте их, чтобы избежать):
#!/bin/bash
set -o noglob
OIFS=$IFS
IFS=","
hero_pairscore=()
while IFS= read -r line
do
hero_pairscore+=( $line )
done < true_pairscore.txt
echo "hero_pairscore=( ${hero_pairscore[@]} )" > embed.txt
set +o noglob
IFS=$OIFS
Тем не менее, вот трюк, позволяющий выполнить описанное выше только в двух строках:
IFS=$',\n' read -ra hero_pairscore -d '' <true_pairscore.txt
echo "hero_pairscore=( ${hero_pairscore[@]} )" > embed.txt
Если файл embed.txt
должен быть получен из другого bash
, вы, вероятно, захотите процитировать каждый элемент записанного массива hero_pairscore
. Для этого замените echo "hero_pairscore = ($ {hero_pairscore [@]})"
с:
echo "hero_pairscore=( $(printf '"%s" ' "${hero_pairscore[@]}") )"
Все, что вам нужно сделать, это следующее:
Установить переменную.Мы будем использовать это:
var = "kijhg, fbjhku ,,, ioy fbjfr, kjmyhg"
Установите $ IFS
и предотвратите расширение имени файла:
IFS знак равно set -f
установить массив
shell $ @
для вывода.
set - $ var
Сбросить родительскую оболочку $ IFS
и параметры оболочки:
unset IFS; set + f
Ура! Он даже сохраняет многократные повторы, пробелы и все такое!
printf% s \\ n "$ @"
ВЫХОД
kijhg
fbjhku
ioy fbjfr { {1}} kjmyhg
В любом случае, поверьте мне на слово. Все символы, кроме ,
, сохраняются.
Я особенно рекомендую использовать реальный массив оболочки, а не массив bash, потому что вы можете мгновенно преобразовать его разделитель.
printf %s "$*"
#OUTPUT#
kijhg fbjhku ioy fbjfr kjmyhg %
IFS=, ; printf %s "$*"
#OUTPUT#
kijhg, fbjhku,,,ioy fbjfr, kjmyhg
Поскольку $ *
имеет особое качество, определенное POSIX для разделения массива аргументов позиционных параметров оболочки на первый символ $ IFS
, вы можете легко преобразовать фрагменты данных так же просто, как что. Вы можете "цитировать"
-защищать массив аргументов и по-прежнему разбивать его на любой отдельный символ, который вам нравится. Если вы сделаете это правильно с первого раза, то есть.
POSIX также определяет особые качества для «$ @»
. Помимо формы адресации "$ 1" ... eval "\ $ {$ #}"
для каждого аргумента, параметр "$ @"
- в кавычках - безопасно расширяется на все аргументов оболочки в том виде, в котором они были в последний раз , установлены
независимо от текущего значения $ IFS.
Итак, если вы хотите добавить список в начало вашего массива, сделайте следующее:
set -- $list "$@"
В начало / хвост:
set -- $head "$@" $tail
Чтобы утроить ваш массив:
set -- "$@" "$@" "$@"
Если ваш поток данных не очень large, следующая операция может быть немного быстрее, чем ваша текущая операция (хотя, если вы работаете с файлами, вам будет гораздо лучше вообще отказаться от разделения оболочки) :
( set -f -- ; IFS=, ; while read -r line ; do set -- "$@" $line ; done
printf %s "$*" ) | cat >out
Чего я не понимаю, так это - что ты делаешь? Вы пытаетесь заменить символы новой строки запятыми? Я имею в виду - данные уже разделены запятыми, за исключением только новой строки? Если да:
tr '\n' ',' <in >out