Замените префиксную строку в линиях файла и поместите в массив bash.

Вопрос или проблема

В файле groupAfiles.txt находятся следующие строки:

file14
file2
file4
file9

Мне нужен способ преобразовать их, чтобы убрать file и добавить /dev/loop, помещая их все в одну строку с пробелами между ними.

/dev/loop14 /dev/loop2 /dev/loop4 /dev/loop9

Затем мне нужно поместить это в массив.

(но числа меняются)

Как мне это сделать?

Считайте оригинальные имена в массив:

readarray -t names < groupAfiles.txt

Замените начальный префикс file на /dev/loop:

names=( "${names[@]/#file//dev/loop}" )

Здесь используемая замена заменит строку file в начале каждого элемента массива names, если этот префикс присутствует, на строку /dev/loop.

Чтобы отобразить полученный массив с пробелами между элементами (предполагая, что переменная оболочки IFS имеет значение по умолчанию):

printf '%s\n' "${names[*]}"

Тестирование:

$ cat groupAfiles.txt
file14
file2
file4
file9
$ readarray -t names < groupAfiles.txt
$ names=( "${names[@]/#file//dev/loop}" )
$ printf '%s\n' "${names[*]}"
/dev/loop14 /dev/loop2 /dev/loop4 /dev/loop9

Чтобы сделать это с помощью awk, вы можете использовать команду подобного вида:

awk '{gsub("file",""); printf "/dev/loop%s ", $0}' input_file

или

awk '{gsub("file","/dev/loop"); printf "%s ", $0}' input_file

Это заменяет file на пустую строку и затем выводит /dev/loop, объединенное с номером/строкой

Чтобы добавить в массив, вы можете использовать:

array=( $(awk '{gsub("file",""); printf "/dev/loop%s ", $0}' input_file) )

Просто прочитайте это в массив, а затем выведите с пробелами, как вам нравится:

$ readarray -t files < <(sed 's:file:/dev/loop:' groupAfiles.txt)

$ declare -p files
declare -a files=([0]="/dev/loop14" [1]="/dev/loop2" [2]="/dev/loop4" [3]="/dev/loop9")

$ printf '%s\n' "${files[*]}"
/dev/loop14 /dev/loop2 /dev/loop4 /dev/loop9

Ответ или решение

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

Исходные Данные:

Файл groupAfiles.txt содержит следующие строки:

file14
file2
file4
file9

Наша цель - удаление префикса file, замена его на /dev/loop и вывод всех строк в одну строку с пробелами между ними, а затем помещение результата в массив.

Подход 1: Использование Bash

  1. Чтение строк из файла в массив:
    Чтобы считать строки из файла в массив в Bash, используем команду readarray:

    readarray -t names < groupAfiles.txt
  2. Замена префикса:
    Используя замену в массиве, удалим префикс file и добавим /dev/loop:

    names=( "${names[@]/#file//dev/loop}" )
  3. Вывод результата в одну строку:
    Для отображения полученного массива с пробелами между элементами, используем:

    printf '%s ' "${names[@]}"
  4. Объявление массива:
    Чтобы удостовериться в том, что массив правильно заполнен, можно вывести его с помощью:

    declare -p names

Полный пример на Bash:

# Чтение файла в массив
readarray -t names < groupAfiles.txt

# Замена префикса
names=( "${names[@]/#file//dev/loop}" )

# Вывод результата
printf '%s ' "${names[@]}"

Подход 2: Использование awk

Как альтернативу, можем использовать awk, чтобы сразу обработать строки и записать их в массив Bash:

# Чтение и преобразование с помощью awk
array=( $(awk '{gsub("file",""); printf "/dev/loop%s ", $0}' groupAfiles.txt) )

Этот подход выполняет замену префикса и сразу формирует массив нужного формата.

Заключение

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

Если у вас возникнут дополнительные вопросы или потребуется помощь с реализацией, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...