Скрипт Bash с циклическим вводом строки - PullRequest
3 голосов
/ 03 сентября 2011

Я делаю следующее, что в основном работает. Сценарий пытается вставить несколько строк в файл, чтобы переписать его.

Но он удаляет все пустые строки, а также все отступы. Основная проблема заключается в том, что он не обрабатывает последнюю строку файла. Я не уверен почему.

     while read line; do
        <... process some things ...>
        echo ${line}>> "${ACTION_PATH_IN}.work"
     done < "${ACTION_PATH_IN}"

Что можно сделать, чтобы это исправить?

Ответы [ 4 ]

5 голосов
/ 03 сентября 2011
while IFS= read -r line; do
    ## some work
    printf '%s\n' "$line" >> output
done < <(printf '%s\n' "$(cat input)")
  • Пустой IFS указывает read не удалять начальные и конечные пробелы.
  • read -r не позволяет обратной косой черте в EOL создавать продолжение строки.
  • Сделайте двойную кавычку подстановки вашего параметра ("$line"), чтобы оболочка не делила слова и не разбирала их значения.
  • Используйте printf '%s\n' вместо echo, поскольку он надежен при обработке таких значений, как -e, -n и т. Д.
  • < <(printf '%s\n' "$(cat input)") - уродливый способ LF завершить содержимое input. Возможны и другие конструкции, в зависимости от ваших требований (конвейер вместо перенаправления из процесса подстановки, если все в порядке, что весь ваш while работает в подоболочке).
    Возможно, было бы лучше, если бы перед обработкой вы просто удостоверились, что он завершен на LF.
3 голосов
/ 03 сентября 2011

Лучше всего, используйте инструмент, такой как awk вместо while цикла оболочки.Во-первых, awk предназначен для анализа / манипулирования файлами, поэтому для обработки огромного файла awk имеет преимущество.Во-вторых, вам не нужно заботиться о том, есть ли у вас последний символ новой строки или нет (для вашего случая).

Следовательно, эквивалент вашего цикла while read:

awk '{
  # process lines
  # print line > "newfile.txt"
}' file 
1 голос
/ 03 сентября 2011

Одной из возможных причин не читать последнюю строку является то, что файл не заканчивается новой строкой.В целом, я ожидал бы, что это сработает, но это может быть причиной.

На MacOS X (10.7.1) я получил такой вывод, который вы наблюдаете:

$ /bin/echo -n Hi
Hi$ /bin/echo -n Hi > x
$ while read line; do echo $line; done < x
$

Очевидное исправление заключается в том, чтобы файл заканчивался символом новой строки.

0 голосов
/ 03 сентября 2011

Во-первых, используйте

echo "$line" >> ...

Обратите внимание на кавычки. Если вы их не положите, оболочка сама уберет отступы.

Что касается последней строки, это странно. Это может быть связано с тем, заканчивается ли последняя строка файла \n или нет (это хорошая практика, и почти любой редактор сделает это за вас).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...