2012-02-16 8 views
11

Mam wyszukiwane przez długi czas, jak zrobić prosty ciąg manipulacji w UNIXZmiana char ciąg w indeksie X

Mam ten ciąg:

theStr='...............' 

I muszę zmienić 5th char do A, jak to zrobić?

W C# to zrobić jak ten theStr[4] = 'A'; // Zero based index.

Odpowiedz

27

Można to osiągnąć z sed, redaktor linia stream:

echo $theStr | sed s/./A/5

Najpierw rura wyjście $ theStr do sed, który zastępuje piątą postać z A.

+0

+1. Rzeczywiście, sed jest właściwym narzędziem. Na marginesie ta konkretna wersja działa tylko wtedy, gdy wejściowy ciąg składa się z "." – CodeExpress

+2

Nie, właściwie '.' nie reprezentuje znaku" kropka ", ale pasuje do wszystkich postaci. Gdybym chciał dopasować kropkę, napisałbym "\." – jurgemaister

+0

hah, nie zdawałem sobie z tego sprawy, kiedy to napisałem. To jest idealne! – CodeExpress

3

Nie wiem, czy to eleganckie, lub która wersja bash trzeba, ale

theStr="${theStr:0:4}A${theStr:5}" 

Pierwsza część zwraca pierwsze cztery znaki, a następnie znak „a”, a następnie wszystkie postacie, począwszy od dnia 6 jednego

9
a="............" 
b="${a:0:4}A${a:5}" 
echo ${b} 

Oto jeden naprawdę dobry tutorial na st manipulacja pierścieniem.

0
[email protected]:~$ echo 'replace A please' | sed 's/^\(.\{8\}\).\(.*\)/\1B\2/' 
replace B please 

Powyższe polecenie sed zastępuje znak 8. znak bez względu na to, co to jest, dlatego nie trzeba określać, co aracter ma zostać zastąpiony.

W powyższym kodzie po prostu trzeba wymienić

  • 8 z pozycji znaku chcesz
  • B z charakterem, co ma zastąpić!

Więc dla konkretnego przykładu staje:

[email protected]:~$ echo '...............' | sed 's/^\(.\{4\}\).\(.*\)/\1A\2/' 
....A.......... 

Nie wspominając, że można zastąpić sznurkiem, zapewniając ciąg zamiast B lub po prostu usunąć, nie oferując niczego gdzie B jest (\1\2)