awk или sed для синтаксического анализа элементов из пути к каталогу

Понятно! Я дважды проверил все места одиночных настроек, описанных в вопросе выше, и сделал две вещи:

  1. в init Я установил для rootCommand значение fbsetroot -solid grey15
  2. int startup Я рекомендую строку с fbsetbg -l
1
29.03.2018, 19:58
3 ответа

Предполагая, что это только каталоги ниже/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выполняет три действия:

  1. заменяет все от точки до следующей косой черты точкой, создавая

    /tmp/(1) I./01./a.
    /tmp/(2) II./03./d.
    
  2. удаляет бит до первого пробела,

    I./01./a.
    II./03./d.
    
  3. удаляет косые черты,

    I.01.a.
    II.03.d.
    
1
27.01.2020, 23:23

На самом деле нет необходимости в 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.

Регулярное выражение внутри разбивается на три компонента:

  1. ^/tmp/[^[:space:]]+[[:space:]]([^[:space:]]*).*/

Имя файла должно начинаться ^с /tmp/, затем должно содержать некоторые не-пробельные символы, за которыми следует пробел, за которым следует (захват этих )не-пробельных символов, затем что-либо до вперед -косая черта

  1. ([^[:space:]]*).*/

... за которым следует (захват этого )не -пробела, затем что-либо до косой черты -

  1. ([^[:space:]]*)

... за которым следует (захват этого )не -символа пробела)--за которым следует... ничего, о чем мы заботимся.

Bash сохраняет эти захваченные биты в массив BASH _REMATCH, основываясь на порядке захватываемых скобок.

2
27.01.2020, 23:23

Черт возьми, раз 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.
0
27.01.2020, 23:23

Теги

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