Рейтинг:0

команда echo разрывает строки, используемые в циклах

флаг br

В моем файле 'foo' есть первая строка: 'a b' и вторая строка: 'c d':

$ кошка фу
а б 
CD

Я хочу напечатать в терминале в цикле эти две строки: одну за другой:

$ для i в $ (кошка foo); эхо $i; сделано

Но в выводе команда «эхо» нарушает порядок, поэтому вместо:

а б
CD

У меня на самом деле есть:

а
б
с
г
pLumo avatar
флаг in
`for i in $(cat foo)` зацикливает не строки, а слова, разделенные вашим разделителем полей (`IFS`).
флаг br
Итак, как я могу зациклить строки/изменить режим IFS на зацикливание строк, а не слов?
pLumo avatar
флаг in
Если вы сообщите нам, что вы на самом деле хотите сделать, мы можем помочь вам сделать это правильно, используя `sed` или что-то в этом роде.,
Рейтинг:4
флаг in

для я в $ (кошка foo) зацикливает не строки, а слова (или поля), разделенные вашим разделитель полей $IFS. По умолчанию \n\t (пробел, новая строка, табуляция).

Если вы измените разделитель полей только на новую строку, вы можете использовать свою команду как есть (Отказ от ответственности: читайте ниже!):

ЕСЛИ=$'\n'
для i в $(cat foo); эхо $i; сделано

Возможно, вы захотите сделать резервную копию IFS, чтобы восстановить ее позже:

OLD_IFS="$IFS"
.
.
.
ИФС="$OLD_ИФС"

Вывод:

а б
CD

Однако это считается Плохо упражняться.

  • Немного лучше: в то время как IFS= читать строку -r; сделать ... сделать < файл
  • Гораздо лучше: используйте специальный инструмент для вашей задачи, такой как grep, сед или же аук.

Пожалуйста прочти Почему использование цикла оболочки для обработки текста считается плохой практикой?.

флаг br
Как я могу использовать «grep» вместо этого?
pLumo avatar
флаг in
Мы не можем знать, потому что мы не знаем, что вы хотите сделать, см. мой последний комментарий к вашему вопросу.
Рейтинг:2
флаг ph

Ты можешь использовать во время чтения для этой цели

[/tmp]$ при чтении строки ; выполнить эхо $line ; сделано <фу                                     
а б
CD

Добавление разделителя для вашего понимания

[/tmp]$ при чтении строки ; выполнить эхо $line ; эхо "----" ; сделано <фу                       
а б
----
CD
----
[/tmp]$    
флаг br
Если я хочу использовать ваше решение, а также добавить условный оператор внутри цикла for, то что будет «$i»? Я имею в виду что-то вроде этого: for i in $(while read line ; do echo $line ; done
флаг hr
Обратите внимание, что `$line` следует заключать в кавычки `"$line"` по тем же причинам (иначе это будет слово, разделенное на отдельные токены - попробуйте, например, `a b` вместо `a b`).
флаг hr
... также, `read` по-прежнему будет удалять все начальные пробелы и расширять escape-последовательности по умолчанию, поэтому, в более общем смысле, если вы хотите отображать строки *точно*, вам нужно `while IFS= read -r line; do ...` или (чтобы включить последнюю строку, возможно, неправильно завершённую) `while IFS= read -r строка || [[ -n "$line" ]]; сделать ...`
bac0n avatar
флаг cn
@JosefKlimuk ```во время чтения -r; делать если! grep -oe 'а'

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.