Понятно! Я дважды проверил все места одиночных настроек, описанных в вопросе выше, и сделал две вещи:
Предполагая, что это только каталоги ниже/tmp
:
$ find /tmp -mindepth 3 -type d -print | sed -e 's/\.[^/]*/./g' -e 's/^.* //' -e 's#/##g'
I.01.a.
II.03.d.
Команда find
находит каталоги на уровне 3 и выводит полный путь к ним. Результатом этого шага является
/tmp/(1) I. First Majuscule Roman Numeral/01. First Arabic Numeral/a. First Grapheme
/tmp/(2) II. Second Majuscule/03. Third Arabic/d. Fourth
Команда sed
выполняет три действия:
заменяет все от точки до следующей косой черты точкой, создавая
/tmp/(1) I./01./a.
/tmp/(2) II./03./d.
удаляет бит до первого пробела,
I./01./a.
II./03./d.
удаляет косые черты,
I.01.a.
II.03.d.
На самом деле нет необходимости в awk или sed; bash globbing и тестирование регулярных -выражений могут это сделать:
for d in /tmp/*/*/*
do
if [[ $d =~ ^/tmp/[^[:space:]]+[[:space:]]([^[:space:]]*).*/([^[:space:]]*).*/([^[:space:]]*) ]]
then
printf "%s\n" "${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}"
fi
done
Пример вывода:
I.01.a.
II.03.d.
Регулярное выражение внутри разбивается на три компонента:
^/tmp/[^[:space:]]+[[:space:]]([^[:space:]]*).*/
Имя файла должно начинаться ^
с /tmp/
, затем должно содержать некоторые не-пробельные символы, за которыми следует пробел, за которым следует (захват этих )не-пробельных символов, затем что-либо до вперед -косая черта
([^[:space:]]*).*/
... за которым следует (захват этого )не -пробела, затем что-либо до косой черты -
([^[:space:]]*)
... за которым следует (захват этого )не -символа пробела)--за которым следует... ничего, о чем мы заботимся.
Bash сохраняет эти захваченные биты в массив BASH _REMATCH, основываясь на порядке захватываемых скобок.
Черт возьми, раз awk
ответа еще нет...
awk -v FS="" '
{
for (i=1;i<=NF;i++) {
if ($i==" " || $i=="/") {
part=""
} else if ($i==".") {
printf "%s.", part
} else {
part=part FS $i
}
}
}
END { printf "\n" }'
Устанавливает разделитель полей на "", чтобы он мог циклически перебирать каждый символ. Ищет " " или "/" в текущем символе и сбрасывает переменную части держателя (), если находит. Если он находит "." распечатать держатель, в противном случае соединить текущий символ с держателем. Добавляет перевод строки, когда это делается.
Вывод на примере:
I.01.a.
II.03.d.