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ąć?


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.