Создание массива с IFS установило на другое значение

Можно использовать php кодирование интерфейса командной строки в сценариях удара для обработки нескольких сложных сценариев, которые на самом деле охватывают по нескольким строкам кодирования. Во-первых, попытайтесь сделать свое решение с помощью Сценариев PHP и затем позже передать параметры с помощью режима CLI. Таким образом можно получить контроль над превосходными использованиями синтаксических анализаторов XML.

Среда кажется, что можно использовать PHP в клиентском режиме через ssh/shell доступ.

php -f yourxmlparser.php

Теперь, сделайте все вещи в своем php файле. Используйте параметры командной строки, которые это может взять.

Можно даже присвоить, это возвращает значения к Среде оболочки для продолжения отдыха сценариев оболочки.

И другой путь состоит в том, чтобы использовать |grep опцию соответствовать Вашему необходимому значению в рамках XML-файла, если Вы вполне уверены в структуре своего XML-файла, который не изменяется со временем.

5
22.04.2014, 02:53
2 ответа

Чтобы сделать то, что, как я думаю , вы пытаетесь сделать, то есть считывать каждое разделенное запятыми поле в 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[@]}") )"
5
27.01.2020, 20:34

Все, что вам нужно сделать, это следующее:

  1. Установить переменную.Мы будем использовать это:

     var = "kijhg, fbjhku ,,, ioy fbjfr, kjmyhg" 
     
  2. Установите $ IFS и предотвратите расширение имени файла:

     IFS знак равно set -f 
     
  3. установить массив shell $ @ для вывода.

     set - $ var 
     
  4. Сбросить родительскую оболочку $ IFS и параметры оболочки:

     unset IFS; set + f 
     
  5. Ура! Он даже сохраняет многократные повторы, пробелы и все такое!

     printf% s \\ n "$ @" 
     

    ВЫХОД

     kijhg 
    fbjhku 
     
     
    ioy fbjfr { {1}} kjmyhg 
     

В любом случае, поверьте мне на слово. Все символы, кроме , , сохраняются.

TRANSFORM

Я особенно рекомендую использовать реальный массив оболочки, а не массив bash, потому что вы можете мгновенно преобразовать его разделитель.

printf %s "$*"

#OUTPUT#
kijhg  fbjhku   ioy  fbjfr  kjmyhg %

IFS=, ; printf %s "$*"

#OUTPUT#
kijhg, fbjhku,,,ioy  fbjfr, kjmyhg

Поскольку $ * имеет особое качество, определенное POSIX для разделения массива аргументов позиционных параметров оболочки на первый символ $ IFS , вы можете легко преобразовать фрагменты данных так же просто, как что. Вы можете "цитировать" -защищать массив аргументов и по-прежнему разбивать его на любой отдельный символ, который вам нравится. Если вы сделаете это правильно с первого раза, то есть.

APPEND / PREPEND

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

MAYBE TR?

Чего я не понимаю, так это - что ты делаешь? Вы пытаетесь заменить символы новой строки запятыми? Я имею в виду - данные уже разделены запятыми, за исключением только новой строки? Если да:

tr '\n' ',' <in >out
6
27.01.2020, 20:34

Теги

Похожие вопросы