Могу ли я получить общие гиперссылки в информационных руководствах?

вы можете сделать это так:

cd /usr///.//share/../share//man/man1 || exit
IFS=/; set -f
printf %.1s/  ${PWD%/*}
printf %s\\n "${PWD##*/}"

/u/s/m/man1

и вот sed :

printf %s "$file" |
tr /\\n \\n/      | sed -et$ \
    -e '\|^\.\.$|{x;s|\(.*\)\n.*$|\1|;x;}'  \
    -e 's|^\.\{0,2\}$||;\|.|H;$!d;x'        \
-e$ -e '\|\(\.\{0,2\}.\)\(.*\)\(\n\)|!b'    \
    -e 's||\1\3\2\3|;P;s|\n||;D' |
tr /\\n \\n/

, который очень близок к тому, чтобы делать то же самое, что и функция. ниже. она не сокращается с помощью тильд и не вставляет $ PWD в начало для ведущего без косой черты, как функция (и фактически никогда не печатает ведущую косую черту) , но это можно было бы обработать позже. он действительно обрабатывает компоненты нулевого пути и одиночные точки, а также отсеивает .. случаев.

, учитывая тот же путь man , что и cd выше, он печатает:

u/s/m/man1

он также напечатает одну или две дополнительные ведущие точки для каждого компонента пути, который начинается с такового и не является всего одна или две точки.

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

pathbytes(){
    local IFS=/   o="$-" p
    set -f${ZSH_VERSION+LFy}
    set -- ${1:-$PWD}
    for p   in      /${1:+$PWD} $*
    do      case    $p in   (.|"")  ;;
            (..)    ${1+shift}      ;;
            (/)     set --          ;;
            (*)     set -- $p $*;   esac
    done
    for p   in      //$* ""
    do      case   ${p:-/$3}        in
            ([!./]*)                ;;
            (..*)   set "..$@"      ;;
            (.*)    set ".$@"       ;;
            (//*) ! set "" $1 $1    ;;
            (~)   ! p=\~            ;;
            (~/*)   p="~/$2";set $HOME
                  ! while "${2+shift}" 2>&3
                    do   p="~/${p#??*/}"
                    done 3>/dev/null;;
            esac&&  set ""  "${p%"${p#$1?}"}/$2" "$p/$3"
    done;   printf %s\\n "${p:-$2}"
    set +f  "-${o:--}"
}

, чтобы никогда не менять каталог и не пытаться подтвердить существование какого-либо компонента пути, но он сжимает повторяет / разделители и полностью удаляет /./ одноточечные компоненты и обрабатывает /../ двухточечные компоненты соответствующим образом.

когда $ IFS установлен на некоторый непробельный символ, последовательность из двух или более символов $ IFS приведет к одному или нескольким пустым полям. . поэтому несколько последовательных косых черт работают с аргументами с нулевым значением. то же самое верно и для ведущего символа $ IFS . и поэтому, когда set - $ 1 разбивается, если результирующий $ 1 равен нулю, тогда он начинается с косой черты, иначе $ {1: + $ PWD} если он не равен нулю, я вставляю $ PWD . другими словами, если первый аргумент не начинается с косой черты, перед ним будет добавлено $ PWD . это так близко, как это подходит к проверке пути .

в противном случае первый цикл for рекурсивно инвертирует порядок компонентов пути, например:

      1 2 3
1     2 3
2 1   3
3 2 1

... при этом игнорируются любые одноточечные или нулевые компоненты, а для .. да ...

      1 .. 3
1     .. 3
      3
3

... второй проход меняет этот эффект, и при этом сжимает каждый компонент либо до 2-точек + char , либо 1-точка + char , либо char .

, поэтому он должен работать по каноническому пути независимо от существования.

Я немного прибавил / убавил во вторую петлю. теперь устанавливает реже (только один раз для каждого [! ./] * компонента) , и закорачивает случай шаблон оценки большую часть времени (благодаря вышеупомянутому шаблону) , и включает в себя оценку совпадения хвостового вызова против ~ . если вся или начальная часть (разделенная на целые компоненты) окончательного канонического пути может совпадать с ~ , соответствующий бит будет удален и литерал ~ будет заменен. для этого мне пришлось сохранить полную копию пути вместе с сокращенным (поскольку сопоставление сокращенного пути с ~ , вероятно, было бы не очень полезно) , и поэтому он хранится в $ 3 . последняя ветвь цикла while выполняется только в том случае, если ~ соответствует подмножеству $ 3 .

, если вы запускаете его с включенной трассировкой set -x , вы можете наблюдать за его работой.

$ (set -x;pathbytes ..abc/def/123///././//.././../.xzy/mno)
+ pathbytes ..abc/def/123///././//.././../.xzy/mno
+ local IFS=/ o=xsmi p
+ set -f
+ set -- ..abc def 123   . .   .. . .. .xzy mno
+ set --
+ set -- home
+ set -- mikeserv home
+ set -- ..abc mikeserv home
+ set -- def ..abc mikeserv home
+ set -- 123 def ..abc mikeserv home
+ shift
+ shift
+ set -- .xzy ..abc mikeserv home
+ set -- mno .xzy ..abc mikeserv home
+ set  mno mno
+ set . mno mno
+ set  .x/mno .xzy/mno
+ set .. .x/mno .xzy/mno
+ set  ..a/.x/mno ..abc/.xzy/mno
+ set  m/..a/.x/mno mikeserv/..abc/.xzy/mno
+ set  h/m/..a/.x/mno home/mikeserv/..abc/.xzy/mno
+ p=~/h/m/..a/.x/mno
+ set  home mikeserv
+ shift
+ p=~/m/..a/.x/mno
+ shift
+ p=~/..a/.x/mno
+
+ printf %s\n ~/..a/.x/mno
~/..a/.x/mno
+ set +f -xsmi
1
05.09.2018, 10:05
0 ответов

Теги

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