вторник, 13 апреля 2010 г.

BASH. Проблема с пробелами в файлах.

Очень интересная проблема, в которую по началу все втыкают очень долго.
Например, есть файл, состоящий из строк, в которых есть пробелы. Допустим, нам нужно обработать его  в bash построчно. Первое что, приходит обычно в голову,  сделать примерно так:
> for i in `cat file.txt`; do command $i; done
Однако, результат себя не оправдывает:
> cat spaces.txt
str1 str2 str3 str4
str5 str6 str7 str8
str9 str10 str11 str12

> for i in `cat spaces.txt`; do echo $i;done
str1
str2
str3
str4
str5
str6
str7
str8
str9
str10
str11
str12

Происходит это потому, что "for" разделяет передаваемые ему поля не только по переводу строки, но в том числе и по пробелам, что в свою очередь и приводит к таким проблемам.
Частным решением проблемы может стать использование промежуточных переменных и редактора sed. Например так:
> for i in `cat spaces.txt|sed s/\ /:/g`; do k=`echo $i | sed s/:/\ /g` && echo $k;done
str1 str2 str3 str4
str5 str6 str7 str8
str9 str10 str11 str12
... первым седом мы замемяем все пробелы на двоеточия, вторым, соответственно наоборот. В решении реальной задачи в качестве промежуточного шаблона нужно использовать какой-либо символ, либо какую-либо последовательность, которая не встречается в исходном файле.

Комментариев нет:

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