Возврат каретки мешает sed прочитать все мои файлы

У меня есть длинный список папок, внутри каждой папки есть файл "log.dat". Я хотел прочитать значение определенной строки в этом файле. Я сохранил имена папок в файле "All.txt", в родительской папке, затем я запустил этот код:

#!/bin/bash
in=/a/b/c   #path to the file All.txt  
for i in $(cat $in/all.txt); do
sed -n '/price/p' ${in}/${i}/log.dat

done

Этот код смог прочитать почти все файлы, но по какой-то причине, которую я не могу понять!!! Он вывел следующее сообщение об ошибке:

/log.dat: No such file or directory #(then the path to this file)

Если я выполню команду sed -n '/price/p' log.dat внутри папки, которая вывела сообщение об ошибке. Я получаю ответ!

PS: Содержимое файла ALL.txt (который создается командой ls>All.txt в родительской папке) следующее:

STR-548-021-01
STR-548-021-02
STR-548-022-01
STR-548-022-02
STR-548-023-01
STR-548-023-02
.
.
.
.
.

Я попытался использовать команду "awk" вместо "sed" следующим образом:

awk '{ price }' ${in}/${i}/log.dat

И я получил то же сообщение об ошибке.

Могут ли эти возвраты каретки происходить в Linux в качестве вывода для команды ls>All.txt?

0
02.05.2016, 03:19
2 ответа

В конце $ i есть возврат каретки , потому что в конце строки в all.txt . Вероятно, он был создан в Windows: Windows использует двухсимвольную последовательность CR, LF для обозначения разрыва строки, тогда как Unix (и большая часть остального мира) использует только LF (перевод строки, синоним новой строки в мире Unix), поэтому Unix видит строку с CR в конце.

Преобразуйте файл в окончание строки Unix или удалите CR:

for i in $(cat $in/all.txt); do
  i=${i%$'\r'}
  sed -n '/price/p' ${in}/${i}/log.dat
done

Это ничего не даст, если в конце строки нет CR. Объяснение: $ '\ r' - это возврат каретки , а $ {i%…} - это значение i за вычетом указанного суффикса

Обратите внимание, что ваш сценарий ожидает ввода, разделенного пробелами, а не одного файла в строке, и ввод представляет собой список шаблонов подстановки, а не имена файлов. См. Почему мой сценарий оболочки подавляется пробелами или другими специальными символами? . Это не имеет значения, если во входных данных нет пробелов или подстановочных знаков.

1
28.01.2020, 02:48

Ваше сообщение об ошибке указывает на то, что sed получает аргумент /log.dat - ни $i, ни $in не имеют никакого значения. Я думаю, что у вас пустая строка в файле All.txt.

/log.dat: No such file or directory #(затем путь к этому файлу)

0
28.01.2020, 02:48

Теги

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