Najłatwiejszy sposób na zamianę spacji na (podkreślenia) _ w bash [zamknięte]

92

ostatnio musiałem napisać mały skrypt, który parsował maszyny wirtualne w XenServer, a ponieważ nazwy maszyn wirtualnych są głównie ze spacjami, np. w Windows XP lub Windows Server 2008, musiałem je przyciąć i zastąpić je podkreśleniami _. Znalazłem proste rozwiązanie, aby to zrobić za pomocą seda, który jest świetnym narzędziem, jeśli chodzi o manipulowanie strunami.

echo "This is just a test" | sed -e 's/ /_/g'

zwroty

This_is_just_a_test

Czy są inne sposoby, aby to osiągnąć?

flazzarini
źródło
8
a pytanie brzmi?
RageZ
2
Cześć, Stackoverflow to witryna z pytaniami i odpowiedziami. Zadajesz pytania, a inni na nie odpowiadają, lub możesz odpowiadać na pytania innych. Jeśli chcesz podzielić się swoją wiedzą, możesz zadać pytanie, a potem sam na nie odpowiedzieć (po pozostawieniu czasu na odpowiedź również innym).
mouviciel
2
grupy pomyślały, że dodam tę wiedzę w ten sposób, więc jest tutaj przechowywana. Zresztą zrobię to tak, jak powiedziałeś następnym razem, odpowiadając na moje własne pytanie :)
flazzarini

Odpowiedzi:

175

Możesz to zrobić używając tylko powłoki, bez potrzeby trlubsed

$ str="This is just a test"
$ echo ${str// /_}
This_is_just_a_test
ghostdog74
źródło
5
Lub przekonwertować wszystkie znaki spoza ASCII słów do podkreślenia: ${str//[^a-zA-Z0-9]/_}; tak czy inaczej, jeśli nie trzymasz się czystej powłoki POSIX, użyj dostępnych funkcji.
działa
mogą istnieć również prawidłowe znaki interpunkcyjne. nigdy nie wiemy.
ghostdog74
dzięki za to rozwiązanie dokładnie to czego szukałem.
Wielkie
18

To jest programowanie z pogranicza, ale spójrz na użycie tr :

$ echo "this is just a test" | tr -s ' ' | tr ' ' '_'

Powinienem to zrobić. Pierwsze wywołanie ściska spacje, drugie zastępuje podkreśleniem. Prawdopodobnie musisz dodać TAB-y i inne białe znaki, dotyczy to tylko spacji.

rozwijać
źródło