Как прочитать каждую строку в файле, разделенную разделителями и пробелами

С некоторыми cutреализациями, такими как GNU cut, вы можете сделать:

cut -b 1-./*.text > output

, так как он добавит отсутствующую новую строку, если она отсутствует.

1
02.09.2020, 20:45
1 ответ

FILE=`cat test.txt`сохраняет содержимое файла (, за исключением завершающих символов новой строки )в переменной FILE. Затем echo "$FILE"выводит содержимое файла (, предполагая, что оно не начинается с тире и не содержит обратной косой черты ). Было бы проще прямо написать

for i in `cat test.txt`

Далее, подстановка команды `…`в контексте, допускающем разбиение на слова, разбивает вывод команды на слова, а не на строки.(Это значение по умолчанию, и его можно изменить, хотя это не лучший способ решить вашу проблему. )Это ваша очевидная проблема :цикл выполняется один раз для каждого слова, а не один раз для каждой строки. Кроме того, слова обрабатываются как шаблон оболочки :, если есть строка, подобная test * source=a=b=c, *будет заменена списком имен файлов в текущем каталоге.

Использование awk для извлечения полей из строк работает (за исключением искажения из echo), но это слишком сложно и медленно.

Есть встроенная оболочка, которая считывает строку и разбивает ее на поля:read. Просто используйте это. Чтобы использовать символ =в качестве разделителя полей, установите переменную IFSдля команды read. Передайте параметр -rв read, если вы не хотите рассматривать обратную косую черту в конце строки как указание на продолжение строки.

while IFS='=' read -r DS_NAME HOST_NAME PORT_NUMBER DB_NAME ignored; do
  …
done <test.txt

Дополнительная переменная ignoredделает ваш синтаксический анализатор более надежным в случае наличия дополнительного поля, например.

test connection data source=test.connect.com=1234=testdb=hey, a new field
1
18.03.2021, 23:07

Теги

Похожие вопросы