Не смешивает ли оболочка <space>спри чтении текстовых файлов? - PullRequest
0 голосов
/ 11 ноября 2011

я пытался запустить этот скрипт:

for line in $(cat song.txt)
do echo "$line" >> out.txt
done

запускать его в Ubuntu 11.04

, когда "song.txt" содержит:

I read the news today oh boy
About a lucky man who made the grade

после запускаскрипт "out.txt" выглядит так:

I
read
the
news
today
oh
boy
About
a
lucky
man
who
made
the
grade

Кто-нибудь может сказать мне, что я здесь не так делаю?

Ответы [ 3 ]

6 голосов
/ 11 ноября 2011

Для ввода строки следует использовать while read, например:

cat song.txt | while read line
do
    echo "$line" >> out.txt
done

Лучше (действительно эффективнее) будет следующий метод:

while read line
do
    echo "$line"
done < song.txt > out.txt
1 голос
/ 11 ноября 2011

В цикле for-each-in указанный список предполагается разделенным пробелами. Пробел включает в себя пробел, новую строку, табуляцию и т. Д. В вашем случае список представляет собой весь текст файла и, следовательно, цикл выполняется для каждого слова в файле.

1 голос
/ 11 ноября 2011

Это из-за команды for, которая берет каждое слово из списка, который ей дан (в вашем случае, содержимое файла song.txt), независимо от того, разделены ли слова пробелами илисимволы новой строки.

Что вас здесь вводит в заблуждение, так это то, что ваше имя переменной равно line.for работает только со словами.Перечитайте ваш скрипт, изменив line на word, и это должно иметь смысл.

...