Yanıtlar:
GNU ile sed
:
sed 's/./\&&/2g'
( s
Yerini tutmaz her ( g
) karakteri ( .
(aynı olan) &
ile başlar) &
( \&
) ancak ikinci bir oluşum elde etmek üzere ( 2
)).
portably:
sed 's/./\&&/g;s/&//'
(her tekrarlamayı değiştirin, ancak &
istemediğimiz her şeyi kaldırın ).
Bazı awk
uygulamalarda (boş bir FS için davranış belirtilmediğinden POSIX değil):
awk -F '' -v OFS="&" '{$1=$1;print}'
( gawk
ve birkaç başka awk
uygulamada, boş bir alan ayırıcısı kayıtları karakter bileşenlerine ayırır . Çıktı alanı ayırıcısı ( OFS
) olarak ayarlanır &
. $1
Kaydın yeni alan ayırıcısıyla yeniden oluşturulmasını zorunlu kılmak için (kendisine) bir değer atarız yazdırmadan önce NF=NF
, birçok awk uygulamasında da çalışır ve biraz daha etkilidir, ancak bunu yaptığınızda davranış şu anda POSIX tarafından belirtilmez).
perl
:
perl -F -lape '$_=join"&",@F'
( -pe
her satır için kodu çalıştırır ve sonucu yazdırır ( $_
); -l
satır sonlarını otomatik olarak şeritler ve yeniden ekler; burada boş bir dize olan küme ayırıcıda girdi bölünmesiyle -a
doldurulur . Sonuç, her karakteri bölmek , ardından '&' ile birleştirin ve satırı yazdırın.)@F
-F
@F
Alternatif:
perl -pe 's/(?<=.)./&$&/g'
(öncesinde başka bir karakter olması koşuluyla her karakteri değiştirin (arkasına normal ifade operatörü (? <= ...))
zsh
Kabuk operatörlerini kullanma :
in=12345
out=${(j:&:)${(s::)in}}
(yine, s::
parametre genişletme bayrağını kullanarak boş bir alan ayırıcısına bölün ve ile birleştirin &
)
Veya:
out=${in///&} out=${out#?}
(herşeyin (her karakterden önce) her birini ksh operatörünü &
kullanarak değiştirin ${var//pattern/replacement}
( ksh
boş bir desende başka bir şey anlamına gelir, ancak başka bir şey, ne olduğundan emin değilim bash
) ve POSIX ${var#pattern}
sıyırma ile ilkini kaldırın Şebeke).
ksh93
Kabuk operatörlerini kullanma :
in=12345
out=${in//~(P:.(?=.))/\0&}
( ~(P:perl-like-RE)
perl benzeri normal ifadeleri (perl veya PCRE'lerden farklı) kullanmak için ksh93 glob operatörü (?=.)
olmak, ileriye dönük operatör olmak: bir karakteri onunla başka bir karakter izlemesi koşuluyla değiştirin ( \0
) ve &
)
Veya:
out=${in//?/&\0}; out=${out#?}
(her karakteri ( ?
) &
ve kendisi ( \0
) ile değiştirin, ve gereksiz karakteri kaldırın)
bash
Kabuk operatörlerini kullanma :
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(aynı zsh
sen gerekmez dışında 'ın @()
orada (İhtiyacınız olan Ksh topak operatör extglob
içinde bash
)).
awk -F '' -v OFS="&" 'NF=NF'
Unix yardımcı programları:
fold -w1|paste -sd\& -
Açıklaması:
"fold -w1"
- her bir giriş karakterini kendi satırına sarar
katlayın - her bir giriş satırını belirtilen genişliğe sığacak şekilde sarın
-w, --width = WIDTH 80 yerine WIDTH sütun kullan
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
- &
ayırıcı olarak giriş hatlarını birleştirir
yapıştır - dosya satırlarını birleştir
-s, --seri paralel yerine her seferinde bir dosya yapıştır
-d, --delimiters = LIST, SEKME yerine LIST'deki karakterleri yeniden kullanma
%fold -w1|paste -sd\& -
1&2&3&4&5
(Giriş birkaç satır içeriyorsa birleştirileceklerini unutmayın &
)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
.
sed
aşağıda bir dizi iyi yanıt bulunmaktadır. Ve görevin diğer yollarla nasıl çözülebileceğini göstermek için herhangi bir zarar görmüyorum.
sed 's/\B/\&/g'
\ B - Her yerde, ancak kelime sınırında eşleşir; yani soldaki karakter ve sağdaki karakter ya "kelime" karakterlerinden biri ya da her ikisi de "kelime dışı" karakterse eşleşir.
Bilgi: GNU sed manuel, düzenli ifade uzantıları .
Test yapmak:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
Bu, diğer cevaplardan biraz daha yavaş olacak, ancak oldukça açık:
echo 12345 | perl -lnE 'say join "&", split //'
İşte başka bir yol. Sed ifadesinin ilk kısmı her karakteri yakalar ve sonra karakteri ve işareti ile değiştirir. İkinci bölüm ve işareti çizginin sonundan kaldırır.
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
Çok baytlı karakterler üzerinde de çalışır.
sed
İki kez aramanıza gerek yok , bir sed
komut dosyasının birkaç komutu olabilir:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345
girdi üzerinde çalışmaz