Не используйте все заглавные буквы для неэкспортированных имен переменных, чтобы избежать конфликта с экспортированными и / или встроенными именами.С GNU awk для 3-го аргумента для match () и сокращением \S
для [^[:space:]]
:
$ example='-----BEGIN CERTIFICATE----- line1 line2 line3 -----END CERTIFICATE-----'
$ printf '%s\n' "$example" |
awk 'match($0,/^(\S+ \S+)(.*)(\S+ \S+)$/,a){gsub(/ /,ORS,a[2]); print a[1] a[2] a[3]}'
-----BEGIN CERTIFICATE-----
line1
line2
line3
-----END CERTIFICATE-----
Приведенный выше скрипт будет работать для любого ввода.Вы должны попытаться придумать входные данные, которые сценарии могут потерпеть неудачу, чтобы иметь возможность протестировать любое предлагаемое решение, чтобы увидеть, работает ли оно на самом деле или нет, так как тривиально создать сценарий, который выдает ожидаемый результат из одного конкретного примера ввода игораздо сложнее найти решение, которое работает во всех случаях.
Например, один важный и очевидный пример для проверки:
$ example='-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- -----END CERTIFICATE-----'
, то есть где в 4-строчном сертификатесамо по себе просто случайно / к сожалению будут эти строки:
- строка 1 =
-----BEGIN
- строка 2 =
CERTIFICATE-----
- строка 3 =
-----END
- строка 4 =
CERTIFICATE-----
Выходные данные должны быть:
$ printf '%s\n' "$example" |
awk 'match($0,/^(\S+ \S+)(.*)(\S+ \S+)$/,a){gsub(/ /,ORS,a[2]); print a[1] a[2] a[3]}'
-----BEGIN CERTIFICATE-----
-----BEGIN
CERTIFICATE-----
-----END
CERTIFICATE-----
-----END CERTIFICATE-----
, поэтому, если какое-либо предлагаемое решение не может обработать это правильно, тогда неt использовать это решение.
Ни один из других опубликованных в настоящее время ответов не обрабатывает его правильно:
awk Равиндера:
$ printf '%s\n' "$example" |
awk '
match($0,/- .* -/){
val=substr($0,RSTART,RLENGTH)
gsub(/- | -/,"",val)
gsub(OFS,ORS,val)
print substr($0,1,RSTART) ORS val ORS substr($0,RSTART+RLENGTH-1)
}'
-----BEGIN CERTIFICATE-----
-----BEGIN
CERTIFICATE---------END
CERTIFICATE-----
-----END CERTIFICATE-----
saichovsky'sseds plus pipe:
$ printf '%s\n' "$example" |
sed 's/- /-\n/g; s/ -/\n-/g' | sed '/CERTIFICATE/! s/ /\n/g'
-----BEGIN CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
-----END CERTIFICATE-----
anPerl Убхавы:
$ perl -pe 's/(?:BEGIN|END) CERTIFICATE(*SKIP)(*F)|\h+/\n/g' <<< "$example"
-----BEGIN CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
-----END CERTIFICATE-----