Как напечатать часть имен файлов Linux, которые соответствуют регулярному выражению - PullRequest
0 голосов
/ 05 июня 2018

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

Пример:

ls -lthrh
.
.

-rwxrwxrwx. 1 root   root  633 Oct 31  2016 Oracle_Schedule_ARC-Oracle_ARCH-1477938600005-1002-Oracleorcl-rman1.txt

-rwxrwxrwx. 1 root   root  610 Nov  7  2016 MOD-1478512353102-1002-Oracleorcl-rman1.txt

After applying my regex '.+?(?=-)' I would have everything before the first '-' to be:

Oracle_Schedule_ARC
MOD

Я пытался использовать awk, но я не мог передать ему регулярное выражение.Я подам позжесортировать |uniq для уникального вывода регулярного выражения.

1 Ответ

0 голосов
/ 05 июня 2018

В любой оболочке POSIX (bash, pdksh, ksh93, zsh, dash):

for name in *; do
    printf '%s\n' "${name%%-*}"
done

Это выполнит все имена в текущем каталоге ивывести бит перед первым - символом.Он делает это, удаляя строку с самым длинным суффиксом, совпадающую с -*, из имени файла, используя стандартную подстановку параметров.

Обратите внимание, что -* является шаблоном выделения оболочки, а не регулярным выражением.Регулярные выражения полезны для работы с текстом, но шаблоны глобализации бывают быстрыми и эффективными для работы с именами файлов и путями в целом, так как вам не нужно запускать другой процесс с механизмом регулярных выражений, например awk или sed.

В bash вы также можете вообще избежать использования цикла:

set -- *
printf '%s\n' "${@%%-*}"

Это сначала устанавливает позиционные параметры для имен в текущем каталоге.printf затем вызывается для набора имен, каждое из которых индивидуально преобразуется с той же подстановкой параметров, что и в первой части этого ответа.

То же самое, но с использованием переменной массива, отличной от массива позиционныхпараметры:

names=( * )
printf '%s\n' "${names[@]%%-*}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...