Как сделать несколько расширений фигурной скобки без комбинаторного взрыва?

Просто маленькое обновление, вино 1.4 в наше время доступно в sid репозитории - просто выполненный apt-get update и apt-get install wine.

Исходный ответ:

Вино 1.4-0.1 находится в экспериментальном репозитории. Просто добавьте его к Вашему sources.list, выполненный apt-get update и необходимо смочь установить его.

Взгляните на то, Как видеть версию пакета без установки? который показывает rmadison проверять, который комплект имеет который доступная версия.

5
03.09.2013, 08:06
2 ответа

Я не мог выяснить, как получить это сделанное использование только фигурные скобки. Я не вижу способ достигнуть этого также, поэтому если кто-то более умный, чем я не могу выяснить способ, которым я сказал бы, что это не возможно.

Как альтернатива

Демонстрационные данные

$ tree
.
|-- dir1
|   |-- file1
|   `-- file2
`-- dir2
    |-- file1
    `-- file2

Примеры

$ seq 2 | xargs -i{} echo dir{}/file{}
dir1/file1
dir2/file2

Это может быть помещено в команду как это:

$ echo $(seq 2 | xargs -i{} echo dir{}/file{})
dir1/file1 dir2/file2

или это:

$ ls $(seq 2 | xargs -i{} echo dir{}/file{})
dir1/file1  dir2/file2

или это:

$ ls -l $(seq 2 | xargs -i{} echo dir{}/file{})
-rw-rw-r-- 1 saml saml 0 Sep  2 03:18 dir1/file1
-rw-rw-r-- 1 saml saml 0 Sep  2 03:31 dir2/file2

Почему фигурные скобки не могут сделать этого

Если Вы смотрите на свой исходный пример:

{foo,bar}Q{foo,bar}

Путем это расширено, следующие:

fooQfoo fooQbar barQfoo barQbar

Механизм, который развернул это, называют Декартовым произведением.

Например:

$ echo {A,B}{X,Y,Z}
AX AY AZ BX BY BZ

Или это:

$ echo {M,N}-{A,B}{X,Y,Z}
M-AX M-AY M-AZ M-BX M-BY M-BZ N-AX N-AY N-AZ N-BX N-BY N-BZ

Нет никакого способа создать Декартово произведение, которое приведет к:

fooQfoo barQbar

Вы - только опция, должен или обратиться к обману, такому как это:

$ echo dir{1,2}/file{2,1}
dir1/file2 dir1/file1 dir2/file2 dir2/file1

И затем помещенный это в массив Bash:

$ a=(dir{1,2}/file{2,1})
$ echo ${a[@]:1:2}
dir1/file1 dir2/file2

Другая опция была бы некоторым "другим методом", таким как тот, который я ранее обсудил выше (использование xargs) например.

Ссылки

5
27.01.2020, 20:34
  • 1
    Спасибо за этот ответ, xargs решение будет работать в целом, но кажется слишком сложным для простого решения, которое я ищу (см. мое редактирование, если оно делает его немного более ясным). Я мог взять не для ответа, если существует некоторая причина позади. –  Bernhard 02.09.2013, 14:07
  • 2
    @Bernhard - Я понял Вас вопрос прежде. Я искал некоторое время, чтобы видеть, был ли способ сделать это, и я все еще не думаю, что это возможно. Это - ограничение с регулярными выражениями (фигурные скобки) и способ, которым они расширяются. Нет никакого способа ограничить их. Таким образом, если существует файл и/или каталог, который соответствует regex, который Вы обеспечили через фигурные скобки, нет ничего в Bash, который увеличит расширение. Это жадно. В Perl и другом langs. нотация .* является жадным как это также. Однако langs. обеспечивают механизмы для "управления" им. –  slm♦ 02.09.2013, 18:11
  • 3
    я боялся за этот ответ, надеялся на что-то как {foo,bar}Q{} –  Bernhard 02.09.2013, 18:36
  • 4
    @Bernhard - вот пример, если Вы хотите узнать больше о фигурных скобках: echo {w,t,}h{e{n{,ce{,forth}},re{,in,fore,with{,al}}},ither,at} –  slm♦ 02.09.2013, 19:37
  • 5
    Ха-ха, хороший, хотя это - только вложенный :) –  Bernhard 02.09.2013, 20:46

Я соглашаюсь с slm; я никогда не видел способ сделать это только с расширением фигурной скобки.

Однако с помощью примера в вопросе, я думаю, что самый простой способ получить желаемый вывод состоит в том, чтобы использовать цикл, а не заключить в фигурные скобки расширение и дополнительную постобработку:

$ echo $(for X in foo bar;do echo ${X}Q${X};done)
fooQfoo barQbar
6
27.01.2020, 20:34
  • 1
    я согласился бы, что это походит на самое простое и большую часть читаемой опции. –  kevinmicke 16.11.2017, 22:16

Теги

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