Bir dizeyi bash kullanarak aynı uzunlukta iki alt dizeye nasıl bölebilirim?


12

Bir dizeyi iki yarıya bölmek ve sıralı olarak yazdırmak istiyorum. Örneğin:

abcdef

içine

abc
def

Bunu yapmanın basit bir yolu var mı, yoksa dize işlemesi mi gerekiyor?


Gelen dizeyi nasıl buldunuz? Değişken? Stdin? Diğer?
Jeff Schaller

1
Değişken. Herhangi bir şey çözülebileceği için gerçekten önemli değil (stdin girişi bir değişkene konabilir).
Gabriel Diego

Verimlilik için önemlidir, özellikle de devasa olabilirse. Ve ayrıca kolaylık sağlamak için.
Peter Cordes

Yanıtlar:


16

Kullanma parametre genişleme ve kabuk aritmetik :

Değişkenin ilk yarısı:

${var:0:${#var}/2}

Değişkenin ikinci yarısı:

${var:${#var}/2}

böylece kullanabilirsiniz:

printf '%s\n' "${var:0:${#var}/2}" "${var:${#var}/2}"

Aşağıdaki awk komutunu da kullanabilirsiniz:

awk 'BEGIN{FS=""}{for(i=1;i<=NF/2;i++)printf $i}{printf "\n"}{for(i=NF/2+1;i<=NF;i++){printf $i}{printf "\n"}}'

$ echo abcdef | awk 'BEGIN{FS=""}{for(i=1;i<=NF/2;i++)printf $i}{printf "\n"}{for(i=NF/2+1;i<=NF;i++){printf $i}{printf "\n"}}'
abc
def

Yanıtınız için teşekkürler!
Gabriel Diego

özlü ve zarif bir çözüm.
Dudi Boy

3
Sen-ebilmek kurtulmak $((...)); offve lenbir kısmı ${var:off:len}ikamesi zaten aritmetik ifadeler olarak değerlendirilir. Örnek: foo=01234567; echo "${foo:0:${#foo}/2} ${foo:${#foo}/2}". Yani belgelenmiş ve bu da aynı şey geçerlidir oluyor zshve ksh93bash olarak.
Mosvy

3
Not: Dizenin uzunluğu tekse, bu yine de iki parçaya bölünecek, ancak ikincisi daha uzun bir karakter olacaktır.
peterh - Monica'yı

8

splitBurada, dizeleri ve komut ikamesini kullanarak :

var=abcdef
printf '%s\n' "$(split -n1/2 <<<$var)" "$(split -n2/2 <<<$var)"

7

Başka bir awkkomut dosyası olabilir:

echo abcdef | awk '{print substr($0,1,length/2); print substr($0,length/2+1)}'

1
Bölme /ve /ERE/operatör sözdizimi belirsizliği ve ()isteğe bağlı olma özelliğinden dolayı mawk veya busybox awk ile çalışmadığını unutmayın length(yine de bu uygulamalar POSIX uyumlu değildir). Kullanılması length()veya length($0)yerine burada lengtholanlar için yardımcı olacaktır. Ayrıca awk 'BEGIN{half = int(length(ARGV[1]) / 2); print substr(ARGV[1], 1, half) ORS substr(ARGV[1], half+1)}' abcdef, dize satırsonu karakterleri olsa bile, boruyu ve ekstra işlemi kaydedip çalışmasını sağlayabilirsiniz.
Stéphane Chazelas

1

Python 3

s = input()  # Take one line of input from stdin.
x = len(s) // 2  # Get middle of string. "//" is floor division
print(s[:x], s[x:], sep="\n")  # Print "s" up to "x", then "s" past "x", joined on newlines.

Örneğin,

$ echo abcdef | python3 -c 's = input(); x = len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
def

Dize uzunluğu çift bir sayı değilse, ikinci satır daha uzun olacaktır. Örneğin

$ echo abcdefg | python3 -c 's = input(); x= len(s) // 2; print(s[:x], s[x:], sep="\n")'
abc
defg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.