Хотя рекомендуется решение awk
или sed
, поскольку вопрос также помечен bash
, вы можете сделать все, что нужно, с помощью простого цикла чтения и переменной флага для управления выводом новой строки для первого итерация. По сути, вы читаете каждую строку и используете индексирование строки расширение параметра , чтобы проверить, является ли первый символ нецифровым, а на 1-й итерации просто выведите строку, для всех дополнительных итераций выведите строку предшествует '\n'
. Если строка начинается с цифры, просто выведите ее с пробелом, предшествующим.
Например:
#!/bin/bash
declare -i n=0 ## simple flag to omit '\n' on first string output
while read -r line; do ## read each line
[[ ${line:0:1} =~ [^0-9] ]] && { ## begins with non-digit
## 1st iteration, just output $line, rest output '\n$line'
((n == 0)) && printf "%s" "$line" || printf "\n%s" "$line"
} || printf " %s" "$line" ## begins with digit - output " $line"
n=1 ## set flag
done < "$1"
echo "" ## tidy up with newline
Пример использования / Вывод
$ bash fmtlines test.txt
"abc" 4 21 22 25
"standard" 1
"test" 4 5 10 11 12
Хотя awk
и sed
, как правило, будут быстрее (как правило), здесь без всего лишь цикла while read
и нескольких условных выражений и расширений параметров, нативное решение bash не будет плохим по сравнению .
Посмотрите вещи и дайте мне знать, если у вас есть вопросы.