LINUX.ORG.RU

Цикл из строк.

 


2

2

Как пересчитать строки в цикле? т. е. есть переменная с:

аа ии вв фф

уу ук фуау ва

уау уа

нужно вывести отдельно каждую строку (для примера)

Уже кучу текста прочитал, но так и не нашел ответ на это простой вопрос.

Спасибо.



Последнее исправление: ADR (всего исправлений: 1)

c="аа ии вв фф уу ук фуау ва уау уа"
read v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 <<< ${c}
dexpl ★★★★★
()
Ответ на: комментарий от ziemin

да нет, же... нужны целые строки, а не отдельные слова

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

сори, не правильно запостил...

ADR
() автор топика

зачем считать строки в цикле?
чем wc -l не угодил?
что ты скрываешь от нас?

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

обновил пост. парсер переводы хавает...

Используй lorcode, ADR!

cat somefile | while read line; do sleep 0.1; echo "$line"; done

Ну вот тебе пример

$ i=1; cat file.txt | while read line; do echo $((i++)); done | tail -1
278
$ wc -l file.txt
278

Или так

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от ADR

что я делаю не так?

Для начала, делает дофига седов когда можно один и через точку с запятой

Да и вообще можно так:

sed 's/[!?,.]/&\n/g;s/^\s+//'

А что конкретно не работает? Мог бы сразу и вывод туда же запастить.

Хотя я вижу что не так — строку-то надо кодировать, ибо в ней могут содержаться специальные символы, прежде чем в URL втыкать.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от alozovskoy

выделите мышью строку «тот же скрипт. покажи» и запустите скрипт.

Строка разделится на: «тот же скрипт.» и «покажи»

вот эти строки потом я и хотел видеть в цикле вместо отдельных слов.

Пример:

есть переменная:

str='qwer qwer\n asdf sadf \n 123 123'

как сделать так чтобы в цикле были «qwer qwer», «asdf sadf» и «123 123» вместо отдельных слов? («qwer», «qwer»,«asdf»...)

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

за седы — спасибо, не знал.

А как кодировать?

Мог бы сразу и вывод туда же запастить

есть ограничение на длину строки и чтобы не считать символы, я просто делю строку где только можно (т. е. после символов ",.?" и переносов строк)

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

цикл for разбирает переменную по словам, а мне нужно по строкам

Не вижу, где там у тебя цикл «for» спрятался. А вообще, заключай переменную в кавычки. Вместо

for i in $x; do echo $i; done;
пиши
for i in "$x"; do echo $i; done;

justAmoment ★★★★★
()
Последнее исправление: justAmoment (всего исправлений: 1)
Ответ на: комментарий от ADR

У тебя ещё одна проблема есть — $() съедает переводы строк.

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

Не вижу, где там у тебя цикл «for» спрятался. А вообще, заключай переменную в кавычки. Вместо

По-моему у тебя кавычки не там, они должны быть в echo «$i»

Xenius ★★★★★
()
Ответ на: комментарий от ADR
#!/bin/bash
teststring="string 1. string 2. string 3"
IFS='.'
for item in ${teststring[@]}
do
	echo
	echo "Debug: line=$item"
	echo
done
Debug: line=string 1


Debug: line= string 2


Debug: line= string 3

Докрути под свои нужды

alozovskoy ★★★★★
()
Последнее исправление: alozovskoy (всего исправлений: 2)
Ответ на: комментарий от alozovskoy

Кажись работает, спасибо)

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

тогда выводить все переменную (а не режет по строкам)

Да, тут согласен. Недосмотрел.

Вчера как раз нужно было сконвертировать сериал из 46 серий и 4-х сезонов из формата mkv в avi. Чтобы можно было проиграть их на старом медиаплеере.

И список файлов построчно сохранил в массив «$zm» для последующей обработки.

Вот этот скрипт. Переменная IFS определена как перевод строки, чтобы при сохранении в массив элементы присваивались построчно, а не по словам.

$ cat convert_mkv_to_old_mp4.sh 
#!/bin/sh

declare -a zm
IFS="
"
zm=(`ls */*.mkv | sed 's/mkv$//'`)
new_dir="./avi"
mkdir -p ${new_dir}

for x in ${zm[@]}; do
 echo $x
 echo -------------- ko ko ko --------------
 mkdir -p "${new_dir}/"$(dirname $x)
 ffmpeg -i "${x}mkv" -acodec mp3 -vcodec mpeg4 -f avi -b:v 2M -y -vf scale=640:-1 "${new_dir}/${x}avi"
 echo -------------- ok ok ok --------------
done;

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

Спасибо;)

Может еще подскажете почему не работает «fg» внутри скрипта? (говорит что «управление заданиями не включено»)

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