Так как это должно быть 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'
Поскольку вы отметили этот вопрос как «Дарвин», я предполагаю, что вы используете macOS. В этом случае Xcode по умолчанию клонирует репозитории в ~/Documents
.
Другим соглашением, используемым System V, было создание отдельных каталогов проекта (или распространения приложений )в /opt
. Между прочим, MacPorts хранит свои рабочие каталоги в /opt/local
.
В "Стандарте файловой иерархии" содержатся другие рекомендации.