Вопрос или проблема
В файле 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
-
Чтение строк из файла в массив:
Чтобы считать строки из файла в массив в Bash, используем командуreadarray
:readarray -t names < groupAfiles.txt
-
Замена префикса:
Используя замену в массиве, удалим префиксfile
и добавим/dev/loop
:names=( "${names[@]/#file//dev/loop}" )
-
Вывод результата в одну строку:
Для отображения полученного массива с пробелами между элементами, используем:printf '%s ' "${names[@]}"
-
Объявление массива:
Чтобы удостовериться в том, что массив правильно заполнен, можно вывести его с помощью: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
дает возможность выполнять более сложные трансформации данных. В зависимости от ваших предпочтений и контекста задачи, вы можете выбрать наиболее подходящий способ.
Если у вас возникнут дополнительные вопросы или потребуется помощь с реализацией, не стесняйтесь обращаться!