С Perl
используя lookarounds
мы могли бы выполнить операцию как:
perl -pe 's/(?<=\w)(?=(?:\w{4})+$)/ /g'
Что переводится как :, когда мы стоим на позиции, слева от нас находится буквенно-цифровая цифра, а справа от нас по крайней мере 4 alnum или кратные им числа. прямо до конца строки. Всякий раз, когда такая позиция существует, пространство размещены там. Это глобально влияет на запрошенное изменение.
Мы могли бы использовать bash
для этого:
#!/bin/bash
# symbolic constants
NL=$'\012'; # newline
SP=$'\040'; # space
# elementary regexes
alnum='[0-9a-zA-Z]'; # a single alphanumeric
alnums4=$(csh -c 'repeat 4 echo -n "$1"' "$alnum"); # 4 consecutive alnums
# main processing
while IFS= read -r line res; do
while c4=$(expr "$SP$line$NL" : ".*$alnum\($alnums4\)$NL")
do
res=${c4}${res:+"$SP"}${res-} line=${line%????}
done
printf '%s %s\n' "$line" "$res"
done
Использование редактора GNU sed
:
sed -Ee '
s/\S+/\n&\n/2; # enclose the 2nd field with markers
# a do-while loop to progessively move the right marker to the left,
# consuming 4 alnums in each iteration. Looping stops when 4 alnums+
# 1 alnum at the boundary remains.
:loop
s/(\n[[:alnum:]].*)([[:alnum:]]{4})\n/\1\n \2/
tloop
# clear out the markers when done
s/\n//g
'
Обертка кавычек экранирует специальные символы, поэтому они обрабатываются как литералы. Чтобы вызвать поведение, которое вы ищете, вам нужно будет сделать
eval "$nnn"
eval "$duper"