Мы устанавливаем цикл do-while
и продолжаем преобразовывать последний пробел, смежный с первым не пробелом, пока строка все еще имеет начальный космос.
sed -e '
:loop
/^ /s/ \([^ ]\|$\)/-\1/
tloop
' filename.ext
while IFS= read -r l; do
read -r ll <<<"$(printf '%ss\n' "$l")"
printf '%s%s\n' \
"$(seq -s= 0 "$(expr "$l" : '[ ]*')" | tr = - | tr -cd -)" \
"${ll%?}"
done < filename.ext
-wqdq
-wqdqgrhehr
-cnkzjncicoajc
-hello space
----oejwfoiwejfow
----wqodojw
----more spaces
----more
----
-
--
while
для построчного чтения файла с IFS
, установленным в NULL
. Это имеет целью сохранить все пробелы в строке. IFS
. Это обрежет все начальные пробелы. Мы добавляем фиктивный символ, не являющийся новой строкой, в конце, чтобы предотвратить свертывание завершающих строк новой строки на этапе расширения команды. Мы снимаем его во время печати. expr
является определение количества совпадений, в нашем случае пробелов в начале строки. seq
и tr
с соответствующей настройкой. обрезанной
строкой, т. е. строкой, считываемой через IFS по умолчанию.