2016-02-22 1 views
4

У меня есть файл установочного файла 1,2,3, что означает размещение , после 1-го, 2-го и 3-го байт.Как вставить символ после первого байта в строке в Linux

Например мой вход

stackoverflow 

, то я хочу, чтобы сделать его

s,t,a,ckoverflow 

Как я должен сделать это с помощью инструментов Linux? Я чувствую, что нужно использовать sed, но я не знаю, как это сделать.

Edit:

У меня есть более чем 10 запятых для размещения. И строка также включает многобайтовые символы.

+0

Я обновил свой ответ на основе вашей новой информации о многобайтовых символах. –

ответ

1

В sed:

echo stackoverflow | sed 's/./&,/1;s/./&,/3;s/./&,/5' 

s/.../.../nзаменяет п й матч. После первой замены второй байт теперь будет третьим, и после этого третий байт теперь станет пятым.

Или, с регулярными выражениями группы:

echo stackoverflow | sed 's/\(.\)\(.\)\(.\)/\1,\2,\3,/' 

В основных регулярных выражениях (BRE), \(…\) используются для группирования выражений. Вы можете обратиться к тексту, который соответствует n-й группе, используя \n, для повторного использования сопоставленного текста в замене, например. Итак, в этом случае у меня есть три группы, каждая из которых содержит только ..

С GNU СЭД, вы можете избежать \ с помощью расширенных регулярных выражений (ЭРД):

echo stackoverflow | sed -r 's/(.)(.)(.)/\1,\2,\3,/' 

С мультибайтных кодировок, попробуйте с C локали:

$ echo 'æ ' | LC_ALL=C sed 's/\(.\)\(.\)\(.\)/\1,\2,\3,/' 
�,�, , 
$ echo → | LC_ALL=C sed 's/\(.\)\(.\)\(.\)/\1,\2,\3,/' 
�,�,�, 
+1

Это не работает с многобайтовыми кодировками. – hek2mgl

+0

@ hek2mgl 'LC_ALL = C sed ...', возможно? – muru

+0

Как это изменит вводную кодировку? – hek2mgl

1
IFS=, read -ra arr <<< "$1" 
rules=() 
for i in "${arr[@]}"; do 
    rules[$i]=1 
done 

s=stackoverflow 
for ((i=0; i<${#s}; i++)); do 
    if ((${rules[i+1]})); then 
     printf '%s,' "${s:i:1}" 
    else 
     printf '%s' "${s:i:1}" 
    fi 
done 

Использование пример:

$ ./sof 1,2,3 
$ s,t,a,ckoverflow 
$ ./sof 1,2,3,7 
$ s,t,a,ckov,erflow 
0

Вот альтернатива без использования sed, которая может обрабатывать многобайтовые символы и более 10 запятых.

S="♥stackoverflow" 
I="1,2,11" 
i=0 
for j in `echo $I | tr ',' '\n'`; do 
    printf ${S:i:j-i} 
    i=$j 
done 
printf ${S:i} 

Этот сценарий имеет следующий вывод:

♥,s,tackoverf,low 

С I="1,2,3,4,5,6,7,8,9,10,11" выход есть:

♥,s,t,a,c,k,o,v,e,r,f,low 
1

Это может работать для вас (GNU СЭД):

sed 's/\B/\n/g;s/\n//4g;s/\n/,/g' file 

или:

sed 's/\B/,/;s/\B/,/;s/\B/,/' file 
Смежные вопросы