Bash захватывает в расширении скобки - PullRequest
2 голосов
/ 03 октября 2019

Какой лучший способ использовать что-то вроде группы захвата в регулярном выражении для расширения скобок. Например:

touch {1,2,3,4,5}myfile{1,2,3,4,5}.txt

приводит ко всем перестановкам чисел и 25 различным файлам. Но в случае, если я просто хочу, чтобы файлы типа 1myfile1.txt, 2myfile2.txt, ... с первым и вторым числом одинаковыми, это, очевидно, не работает. Поэтому мне интересно, что было бы лучшим способом сделать это? Я думаю о чем-то вроде захвата первого номера и использования его во второй раз. Идеально без тривиальной петли.

Спасибо!

Ответы [ 3 ]

4 голосов
/ 03 октября 2019

Не используя регулярное выражение, но для цикла и последовательности ( seq ), вы получите тот же результат:

for i in $(seq 1 5); do touch ${i}myfile${i}.txt; done

Или tidier:

 for i in $(seq 1 5); 
 do 
   touch ${i}myfile${i}.txt; 
 done

Например, используя echo вместо touch:

➜ for i in $(seq 1 5); do echo ${i}myfile${i}.txt; done
1myfile1.txt
2myfile2.txt
3myfile3.txt
4myfile4.txt
5myfile5.txt
2 голосов
/ 03 октября 2019

Вариация ответа MTwarog с одним меньшим количеством канала / подпроцесса:

$ echo {1..5} | tr ' ' '\n' | xargs -I '{}' touch {}myfile{}.txt
$ ls -1 *myfile*
1myfile1.txt
2myfile2.txt
3myfile3.txt
4myfile4.txt
5myfile5.txt
2 голосов
/ 03 октября 2019

Для этого можно использовать AWK:

echo {1..5} | tr ' ' '\n' | awk '{print $1"filename"$1".txt"}' | xargs touch

Объяснение:

echo {1..5} - печатает диапазон чисел
tr '' '\ n '- разбивает числа на отдельные строки
awk' {print $ 1 "filename" $ ​​1} '- позволяет форматировать вывод с использованием ранее напечатанных чисел
xargs touch - передает имена файлов команде touch (создает файлы)

...