Парсинг плоского файла с помощью сценария оболочки

Это один из тех немногих случаев, когда утилита переименования из набора util-linux подходит для решения этой задачи. Большинство дистрибутивов поставляют эту утилиту в виде переименования; в Debian, Ubuntu и производных переименование является другой, более мощной утилитой , а утилита util-linux называется rename.ul.

rename 'Garbage ' '' *.txt

Полностью переносимое решение -

for x in *.txt; do
  mv -- "$x" "${x#'Garbage '}"
done

-2
30.04.2015, 10:35
2 ответа

Я не совсем уверен, что понял суть вашего вопроса.

Сначала: IFS - это переменная, содержащая разделитель, вроде табуляции, пробела или чего-то еще. По умолчанию она содержит пробел, табуляцию и новую строку.

РЕДАКТИРОВАНИЕ: от for-петли до while-петли, предложенной тердоном

while read line
do
        echo $line|cut -d\: -f2
done < /path/to/file.csv

Это генерирует этот вывод:

blala
blala
***.***.**.**

Вы можете сделать это и с петлей времени, лично мне просто больше нравится петля for-loop здесь.

Что делает петля? Сначала цикл читает первую строку файла.csv и сохраняет ее в переменную "line".

Внутри цикла мы повторяем переменную $line и разрезаем ее на пейсы. Обрезаем ее разделителем (-d) ":", потому что в файле.csv между идентификатором и значением всегда есть ":". С помощью поле-индикатора (-f) мы хотим показать нам только поле 2 (-f2). Петля for-loop заканчивается, когда в файле.csv больше нет строк.

Дополнительную информацию смотрите в man-странице cut(1).

0
28.01.2020, 05:16

Это может быть заманчиво использовать EVAL , но в качестве паролей могут содержать арбитражные символы (которые могут быть выполнены в качестве кода, он делает его рискованным; гранича - и-просто: «Не делай этого!».
Это работает - используя массивы.

Содержание тестового файла

User:blala
Pass:blala with    spaces: and colons: and $PATH
IP:***.***.**.**

set -f                          # disable globbing
IFS=$'\n'                       # 'word' split only at newline char
value=($(sed 's/:/\n./' file))  # '.' to cater for empty value fields

echo user="${value[1]/./}" 
echo pass="${value[3]/./}" 
echo   ip="${value[5]/./}"

Вывод:

user=blala
pass=blala with    spaces: and colons: and $PATH
ip=***.***.**.**
2
28.01.2020, 05:16

Теги

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