Существует ли соглашение о том, где хранить установленное программное обеспечение?

Так как это должно быть sed, вот два (возможно 4 )решения:

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

s/[\n[:blank:]]\+/\n/g

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

  • Считать весь файл в пространство шаблонов:
    Первое решение — прочитать весь файл в память и обработать его :

    .
    sed ':read;$!{N;bread};  s/[\n[:blank:]]\+/\n/g;   s/^\n//;  $a\' file
    

    Пояснение:

    :read;$!{N;bread};         Read the whole file into the pattern space.
    s/[\n[:blank:]]\+/\n/g;    convert all runs of spaces, tabs and newlines to newline.
    s/^\n*//;                  remove file initial newlines.
    $a\                        add a trailing newline (if missing).
    
  • Работа над каждой строкой (меньше памяти ).
    Альтернативой является обработка каждой строки отдельно, но тогда работа с пустыми строками, начальными и конечными символами новой строки становится сложной :

    .
    sed -E  ':read;$!N;s/[[:space:]]+/\n/g;  :print;s/^\n*//;/\n/{P;s/^[^\n]+//;bprint};$!bread;a\' file
    

    Пояснение:

    :read;                  label to read one (additional) line
    $!N;                    (except on last line) append a line to pattern space.
    s/[[:space:]]+/\n/g;    convert runs of white spaces to one newline.
    :print;                 label to print output.
    s/^\n*//;               remove leading newlines.
    /\n/bread;              if the pattern space has (at least) one newline.
    { 
        P;                  print (up to the first newline).
        s/^[^\n]+//;        remove what was printed.
        bprint;             loop to next part to be printed.
    }                       if the pattern space had no newlines:
    $!bread;                (except on last line) read one more line.
    a\'                     ensure a newline is printed on the last line.
    
  • Использовать два вызова sed.
    Большую часть сложности можно избежать, если делегировать удаление пустых строк второму вызову sed:

    sed -E  '$!N;s/[[:space:]]+/\n/g;l;P;D'  file   | sed '/^$/d;a\'
    
  • Используйте tr для преобразования новых строк в пробелы (все в одной строке)
    Также проще использовать tr для преобразования всех новых строк в один пробел,преобразование всего файла в одну (длинную )строку и последующая обработка с помощью sed:

    <file tr '\n' ' ' | sed -E 's/$/ /;s/[[:space:]]+/ /g;s/^ //;y/ /\n/'
    

Решения POSIXfied:

sed -Ee ':read' -e '$!{N;bread' -e '}' -e 's/[[:space:]]+/\
/g;l;s/^\n//;s/\n+$//;l'

sed -Ee  ':read' -e '$!N;s/[[:space:]]+/ /g;s/^ *//;s/ +$//;:print' -e '/ /{y/ /\n/;P;y/\n/ /;s/^[^ ]+ +//;bprint' -e '}' -e '$!bread' -e 's/ +$//' file

sed -Ee '$!N;s/[[:space:]]+/\
/g;P;D'  "${1-file}"   | sed '/^$/d'
0
11.02.2021, 09:37
1 ответ

Поскольку вы отметили этот вопрос как «Дарвин», я предполагаю, что вы используете macOS. В этом случае Xcode по умолчанию клонирует репозитории в ~/Documents.

Другим соглашением, используемым System V, было создание отдельных каталогов проекта (или распространения приложений )в /opt. Между прочим, MacPorts хранит свои рабочие каталоги в /opt/local.

В "Стандарте файловой иерархии" содержатся другие рекомендации.

1
18.03.2021, 22:31

Теги

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