Вы можете попробовать ed, которого, к сожалению, нет в стандартной установке Debian.
printf '%s\n' \
'g/[^[:blank:]][^[:blank:]]*/kx' \
"'"'x,$j' \
'$s/[[:blank:]]*$//' \
'/[^[:blank:]][^[:blank:]]*/kx' \
'1,'"'"'xj' \
'1s/^[[:blank:]]*//' \
'wq' |
ed -s infile
Или с гну сэд
sed -Ezi 's/^\s+|\s+$//g;s/$/\n/' infile
Использование любого awk в любой оболочке на каждом компьютере UNIX и возможность указать, какой столбец следует изменить, независимо от символов в этом столбце:
$ awk -v c=1 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
$ awk -v c=2 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
001122 ab c def ghi
334455 xy z aaa bbb
667788 cc c ccc ddd
$ awk -v c=3 '{gsub(/../,"& ",$c); sub(/ $/,"",$c)}1' file
001122 abc de f ghi
334455 xyz aa a bbb
667788 ccc cc c ddd
Полная лень печатать здесь,
sed -E "s/([0-9]{2})/\1 /g; s/ +/ /g" file1
Поставьте пробел после каждой пары цифр, а затем уменьшите несколько пробелов до одного элемента.
Или, может быть, еще ленивее
sed 's/./& /4;s/./& /2' file1
Общая версия для любого количества/положения пробелов в awk :
awk -v s='2,4' '{f=!split(s,a,",");for(i in a){r="^.{"a[i]+f++"}";gsub(r,"& ")}}1'
00 11 22 abc def ghi
⋮
Более мощная версия, в которую можно вставлять другие символы, кроме пробела:
spacers(){
awk -v s="$1" '{f=!split(s,a,/[^*0-9]*/);split(s,p,/[*0-9]*/);
for(i in a){if(""==b=a[i])continue;
r="^.{"(b!="*"?b+f++:length($0))"}";
gsub(r,"&"p[i+1])}} 1' $2;}
Таким образом, вы можете сделать, например.:
spacers '0|2 4 6|10@yahoo.com |* |' file
|00 11 22| abc@yahoo.com | def ghi |
, который отлично подходит для создания таблиц организационного -режима и прямой передачи в буфер обмена.
Примечание. :Функция оболочки -также принимает данные через STDIN.
(Более ранние версии этого ответа содержали общее решение awk -, которое использовало sed для окончательной замены)
Наивно, но прямо:
$ sed 's/\(..\)\(..\)\(..\)/\1 \2 \3/' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
То есть сопоставьте и соберите три первые группы из двух символов в каждой строке и разделите их пробелами, вставив пробелы в строку замены.
Необычно, но требует размышлений:
$ sed 's/../ &/3; s/../ &/2' file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd
Это первое выражение заменяет третье совпадение ..
в каждой строке пробелом, за которым следует то, что совпадает с ..
. Потом снова, но уже на 2-й матч.
Если входные данные точно такие, как изображено, GNU cut
является вариантом. Обратите внимание, что --output-delimiter
должен быть явно задан пробелом. Это создает очень жесткое решение, в отличие от некоторых других ответов, в котором отсутствует как гибкость для работы с переменной длиной строки в первом поле, так и возможность назначать произвольное поле для работы.
cut -c1-2,3-4,5- --output-delimiter=' ' <file
00 11 22 abc def ghi
33 44 55 xyz aaa bbb
66 77 88 ccc ccc ddd