Преобразование списка файлов, разделенных новыми строками, в переменную

На мой взгляд, самый простой и читаемый подход:

  1. извлечь первый столбец (вырезать)
  2. удалить первую строку из извлеченного столбца (tail)
  3. вставьте этот столбец в исходный файл (paste)

Пример: ваш пример входного файла:

abc 123    
abc 789  
bcd 456  
acb 135

Затем выполните следующую команду в терминале

cut -d' ' -f1 in.txt | tail -n +2 | paste -d' ' file -

Вывод:

abc 123 abc
abc 789 bcd
bcd 456 acb
acb 135

Структура этого решения отличается от данных ответов. Нет необходимости в условиях, циклах или регулярных выражениях.

0
14.03.2016, 00:07
2 ответа

Вы можете сделать это с помощью globs и расширения параметров . Вам не нужно использовать find , если у вас есть версия bash с globstar для включения синтаксиса ** (bash4 +).

# Enable `**`, and expand globs to 0 elements if unmatched
shopt -s globstar nullglob
# Put all files matching *.clj or *.cljs into ${files[@]} recursively
files=(dir1/**/*.clj{,s})
# Print all files delimited by newlines, with all leading directories stripped
printf '%s\n' "${files[@]##*/}"

Чтобы применить произвольное преобразование, замените последнюю строку на:

for file in "${files[@]}"; do
    some-arbitrary-transformation <<< "$file"
done
2
28.01.2020, 02:27
shopt -s globstar nullglob
var="$(echo **/*.clj **/*.cljs | xargs -n1 basename)"
echo "$var"
1
28.01.2020, 02:27

Теги

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