добавьте каждое слово в результате расширения пути - PullRequest
1 голос
/ 15 апреля 2020

Я бы хотел имитировать c некоторые функции, которые у меня есть в fish оболочке.

Скажем, у меня есть такая структура:

❯ tree
.
└── a
    ├── 1.txt
    ├── 2.txt
    └── 3.txt   

Я хочу избавиться от directory a и prepend b (в более общем случае мне нужно сопоставить путь a с путем b).

В fish я делаю просто:

❯ echo b/(basename a/*.txt)
b/1.txt b/2.txt b/3.txt 

Но тот же трюк в bash только добавляет первый элемент.

$echo b/$(basename a/*.txt)
b/1.txt 2.txt 3.txt 

Что дает? Как имитировать c это поведение хорошим способом, оптимально без циклов в bash или sh?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

В Bash вы можете создать массив из глобуса:

$ files=(a/*.txt)
$ declare -p files
declare -a files=([0]="a/1.txt" [1]="a/2.txt" [2]="a/3.txt")

Затем используйте расширение параметра , чтобы заменить каждый префикс, который жадно соответствует */ на b/ :

$ echo "${files[@]/#*\//b\/}"
b/1.txt b/2.txt b/3.txt

Расширение представляет собой случай расширения ${<em>parameter</em>/<em>pattern</em>/<em>string</em>}, где parameter равно files[@] (применяется к каждому элементу массива), а шаблон начинается с # (совпадение в начале расширенных значений parameter). Поскольку элементы разделены /, sla sh в шаблоне и замене должны быть экранированы.

1 голос
/ 15 апреля 2020

как насчет printf вместо эха?

printf "b/%s " $( basename -a a/*.txt )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...