LINUX.ORG.RU

Разделить вход в массив используя строку как разделитель

 


0

1

Есть вход типа:

dfdfdsf 34354 sdfsdf^^dfdfd
fdfd^^ddfs#$%^&dfdfdsf

Мне надо разделить его в башевский массив таким образом:

dfdfdsf 34354 sdfsdf

dfdfd
fdfd

ddfs#$%^&dfdfdsf

Т.е. использовать последовательность из более, чем одного символа. На stackoverflow когда люди задают такой вопрос их неправильно понимают и говорят что-то вроде «рыба шерсти не имеет. А вот если бы у нее была шерсть там были бы блохи. А вот блохи (IFS) это - ...»

★★
Ответ на: комментарий от sdio

Это по одному. Мне надо использовать строку ^^ как разделитель (при этом разделитель должен быть удален). Плюс ко всему по \n нельзя, потому что стока уже содержит \n.

sambist ★★
() автор топика
Последнее исправление: sambist (всего исправлений: 2)
echo 'dfdfdsf 34354 sdfsdf^^dfdfd
fdfd^^ddfs#$%^&dfdfdsf' |
  sed '$a^^' |
  sed 's/\^\^/\x0/g' |
  while read -d '' i; do
    echo -e "$i\n"
  done
anonymous
()
Ответ на: комментарий от shdown

Ах, да — так sh раньше парсили построчно вывод какой-нибудь команды:

sep='^^'

x='dfdfdsf 34354 sdfsdf^^dfdfd
fdfd^^ddfs#$%^&dfdfdsf'

arr=()

while true; do
    case "$x" in
        *"$sep"*)
            arr+=( "${x%%$sep*}" )
            x=${x#*$sep}
            ;;
        *)
            arr+=( "$x" )
            break
            ;;
    esac
done

printf '%s\n\n' "${arr[@]}"

shdown
()
Ответ на: комментарий от shdown

В консоли работает. В файле указываю #!/bin/bash.

alex@laptop:~$ bash --version
GNU bash, версия 4.3.11(1)-release (i686-pc-linux-gnu)
<...>

sambist ★★
() автор топика
Ответ на: комментарий от sambist

А запускаешь как? Ну, напиши в начале файла ещё

echo >&2 "Bash version: $BASH_VERSION"
. А лучше — выброси это костыли с sed'ом и сделай как тут или возьми zsh.

shdown
()
Ответ на: комментарий от shdown

Большое спасибо! Этот код работает.

sambist ★★
() автор топика
Ответ на: комментарий от anonymous

echo -e «{}\n»

...и обосраться, если на входе будет \.

xargs -0 printf '%s\n\n'
используй штоле. Ну и то, на каждый сегмент будет вызываться бинарник (printf или echo) — тоже не комильфо.

shdown
()

Мне надо разделить его в башевский массив таким образом:

NoWay

обычно с помощью sed я заменяю строку-разделитель на _один_ символ, а потом уже режу массив по $IFS с этим символом.

К сожалению, bash не умеет разделять в массив используя строку как разделитель.

PS: сменить ЯП уже предлагали?

emulek
()
Ответ на: комментарий от emulek

обычно с помощью sed я заменяю строку-разделитель на _один_ символ, а потом уже режу массив по $IFS с этим символом.

Ну и костыли.

К сожалению, bash не умеет разделять в массив используя строку как разделитель.

А это что?

shdown
()

может в JSON?

anonymous
()
Ответ на: комментарий от shdown

обычно с помощью sed я заменяю строку-разделитель на _один_ символ, а потом уже режу массив по $IFS с этим символом.
Ну и костыли.

ну это самый быстрый и прямой путь, который я знаю.

А это что?

а это ручная раскройка строки, и потом ручная клейка танчиков массива. Да, оно тоже работает, я жеж не против. Если вам нравится это решение, используйте, разве я против?

Имелось ввиду, что в bash нет аналога strtok(3).

emulek
()
Ответ на: комментарий от emulek

ну это самый быстрый и прямой путь, который я знаю.

Миль пардон, но это путь через жопу. В ASCII таблице нет символа, который можно использовать не боясь, что его не будет в целевом файле. Я уже налетел на удаление ^ по всему файлу, забыв что это XOR в си.

sambist ★★
() автор топика
Ответ на: комментарий от sambist

Миль пардон, но это путь через жопу. В ASCII таблице нет символа

на самом деле, это зависит от задачи. Для многих задач вполне можно найти символ, если не в ASCII, то в UTF-8 (и bash и sed умеют UTF-8).

В некоторых случаях возможно использование \n или \r.

Вариантов много.

Я уже налетел на удаление ^ по всему файлу, забыв что это XOR в си.

ну тренируй память, что ещё тебе можно сказать?

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.