[Çözüldü] Bash ile karakter değiştirme işlemi

Başlatan Like, 02 Kasım 2014 - 00:09:47

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

Like

Bash ile alınan bir stringin kelimeler arası "_" karakterini boşlukla değiştirmek istiyorum. Ancak sadece kelimeler arası olmalı. "__merhaba_dunya_" giriyorsa "__merhaba dunya_" çıkmalı. Bu işlemi nasıl yapabilirim? Stringi diziye atayıp tek tek karakterleri okumaya çalıştım ama beceremedim. Yardımlarınızı bekliyorum.

if

Şu saatte şöyle bir şey yaptım:


#!/bin/bash
degisken="_merhaba_dunya_"
karakter_sayisi=${#degisken}
bos=" "

i=0
while [ $i -lt $karakter_sayisi ]; do
karakter[$i]=${degisken:$i:1}
i=$(( i + 1 ))
done

j=0
while [ $j -lt $(( karakter_sayisi - 2 )) ]; do
if [[ "${karakter[$j]}"  =~ [a-zA-Z0-9] ]] && [[ "${karakter[$((j+1))]}" == "_" ]]; then
  karakter[$((j+1))]=${bos}
  printf "%s" "${karakter[@]}"
fi
j=$((j+1))
done
exit 0

Like

Alıntı yapılan: if - 03 Kasım 2014 - 01:09:14
Şu saatte şöyle bir şey yaptım:


#!/bin/bash
degisken="_merhaba_dunya_"
karakter_sayisi=${#degisken}
bos=" "

i=0
while [ $i -lt $karakter_sayisi ]; do
karakter[$i]=${degisken:$i:1}
i=$(( i + 1 ))
done

j=0
while [ $j -lt $(( karakter_sayisi - 2 )) ]; do
if [[ "${karakter[$j]}"  =~ [a-zA-Z0-9] ]] && [[ "${karakter[$((j+1))]}" == "_" ]]; then
  karakter[$((j+1))]=${bos}
  printf "%s" "${karakter[@]}"
fi
j=$((j+1))
done
exit 0


öncelikle ilgilendiğiniz için teşekkür ederim ancak sadece iki kelime için çalışıyor. "__merhaba_dunya_ab_c__" ifadesini soktuğumda,

__merhaba dunya_ab_c____merhaba dunya ab_c____merhaba dunya ab c____merhaba dunya ab c _

sonucunu veriyor.

Ben de şöyle bir şey denedim ama olmadı. Hatalarımı söyler misiniz?

#!/bin/bash
function deneme()
{
x=$1
i=0
while [ $i -lt ${#x} ]; do y[$i]=${x:$i:1};  i=$((i+1));done
for ((a=0; a<${#y}; a++))
do
if [ ${y[a]}!='_' ]
then
break
fi
done

for (( (b=${#y}-1); b>0; b-- ))
do
if [ ${y[b]}!='_' ]
then
break
fi
done

for (( k=a; k<b; k++ ))
do
if [ ${y[k]} = '_' ]
then
${y[k]}=' '
else
${y[k]}
fi
done
echo ${y[@]}
}
deneme "__merhaba_dunya_ab_c_"


önce "_" olmayan ilk ve son karakteri bulup, bunlar arasında kalan dizide işlem yapmak istedim.

if

Bütün "_" karakterlerin temizlenmesi istense işimiz çooook kolay:) Bu haliyle kazık bir soru:) Biraz kafamı toparlamam gerek.

if

#4
Siz farkı karşılaştırın:)


#!/bin/bash
function deneme()
{
len=${#x}
i=0

while [ $i -lt $len ]; do
y[$i]=${x:$i:1}
i=$((i+1))
done

for ((a=0; a<$len; a++)); do
# İlk "_" karakterini es geçmek için
# denktir kullanmalıydın.
# if döngüsü için [[ ]] ve çift tırnak
# kullanmanı öneririm.
if [[ "${y[$a]}" == "_" ]]; then
  # a'nın son değerini ataman gerek
  # değişkene ki sonradan kullanasın
  a=${a}
  break
fi
done

for (( b=$((len-1)); b>0; b-- )); do
if [[ "${y[$b]}" == "_" ]]; then
  # b'nin değerini atayalım.
  b=${b}
  break
fi
done

for (( k=$((a+1)); k<$b; k++ )); do
if [[ "${y[$k]}" = "_" ]]; then
  y[$k]=" "
else
  : # bir şey yapma demek
fi
done

echo ${y[@]}
}
# x değişkeninin betiğin ilk konumsal parametresinin
# değerini almasını istiyorsan, x değişkenini fonksiyonun
# dışında tanımlamalısın
x=$1
deneme
# Her zaman betikten 0 döndürecek şekilde çıkmak iyidir.
exit 0

Like

yardımcı olduğunuz için çok teşekkür ederim. Parantezleri tam çözememişim. İlk parametre konusunu da öğrendiğim iyi oldu :)

if

Rica ederim. İstediğiniz gibi oldu mu?

Like

if'li kısımlarda değişiklik yapınca oldu. Baştaki ve sondaki ilk "_" leri değil de hepsini es geçmek gerekiyordu.

if


Like

Son hali şu şekilde olmuştu.

#!/bin/bash
function deneme()
{

len= ${#string}
i=0

while [ $i -lt $len ]; do
dizi[$i] = ${string:$i:1}
i= $((i+1))
done

for ((a=0; a<$len; a++)); do
if [[ "${dizi[$a]}" != "_" ]]; then
  break
fi
done

for (( b=$((len-1)); b>0; b-- )); do
if [[ "${dizi[$b]}" != "_" ]]; then
  b= ${b}
  break
fi
done

for (( k=$((a+1)); k<$b; k++ )); do
if [[ "${dizi[$k]}" = "_" ]]; then
  dizi[$k]= " "
else
  :
fi
done
printf "%s" "${dizi[@]}"
}
string= $1
deneme
exit 0

if

#10
Değişken atamalarında eşittir işaretinden sonra boşlıklar görünüyor, onları silin.
http://kb.ubuntu-tr.net/cozulen-basliklarin-etiketlenmesi