2011-09-23 4 views
6

Próbuję uruchomić proste polecenia powłoki w moim skrypcie, ale nie jestem w stanie pozbyć się nowych linii, nawet używając chomp lub chop.Pozbądź się nowej linii z poleceń powłoki w Ruby

Czy jest coś, czego mi brakuje?

 u=`echo '#{l}' | cut -d: -f4`.chop() 
     p2=`echo '#{l}' | cut -d: -f3`.chop() 
     p1=`echo '#{l}' | cut -d: -f2`.chop() 
     h=`echo '#{l}' | cut -d: -f1`.chop() 


#  **Cant get newlines to go after p1 and p2 !! ??** 
     path="#{p1}/server/#{p2}abc" 
     puts path 


Output: 
/usr (p1) 
/server 
/bin (p2) abc 
Expected Output: 
/usr/server/binabc 

Wszelkie sugestie?

Według niektórych sugestii, zmienił mojego kodu:

h, p1, p2, u = l.split /:/ 
u.strip 
u.chomp 

puts u.inspect 

wyjściowa: "string\n"

zasadzie próbowałem przy użyciu chomp przed i walił ten sam problem. Czy muszę nazywać chomp w inny sposób lub dodawać jakieś klejnoty?

+0

Czym dokładnie jest problem? Jakie są oczekiwane wyniki? – Geo

Odpowiedz

7

Użyj albo String#strip, aby usunąć cały biały znak zawijania, albo String#chomp (zwróć uwagę na "m"), aby usunąć pojedynczy ciąg tylko nowej linii.

String#chop usuwa ostatni znak (lub parę \r\n), co może być niebezpieczne, jeśli polecenie nie zawsze kończy się znakiem nowej linii.

Zakładam, że twój kod nie zadziałał, ponieważ wyniki zawierały wiele znaków nowej linii/białych znaków na końcu danych wyjściowych. (A jeśli tak, to strip będzie działać dla ciebie). Możesz to jednak sprawdzić, usuwając wywołanie chop, a następnie używając p u lub puts u.inspect, aby zobaczyć, jakie znaki rzeczywiście znajdują się na wyjściu.

Dla twojej informacji w Rubim jest idiomatyczne pomijanie nawiasów podczas wywoływania metod, które nie przyjmują żadnych argumentów, np. u = foo.chop.

+0

Thanx @phrogz. Wysłałem wyniki u.inspect. Wciąż uderzam w tę samą kwestię, czy nie powołuję się na nią we właściwy sposób? – codeObserver

+0

@codeObserver Użycie 'u.chomp' nic nie da, ponieważ jest to niezmodyfikowana wersja metody. Musisz wykonać 'u.chomp!' Lub 'u = u.chomp'. To samo dotyczy '.strip' versus' .strip! '. – Phrogz

+0

thnx. To naprawiło to. – codeObserver

3

str.chomp wll usunąć znak nowej linii z ciągów. str.chop usuwa tylko ostatnią literę.

2

Czemu wołając do powłoki na coś tak prostego:

h, p1, p2, u = l.split /:/ 
+0

thnx glenn. Zasadniczo wciąż uczę się Rubiego i próbuję przenieść do Rubiego kilka skryptów powłoki. Tak więc jako pierwsza iteracja próbuję po prostu uruchamiać polecenia powłoki natywnie w strukturze ruby, a następnie wziąłbym przepustkę, by wyeliminować niepotrzebne – codeObserver

+0

. Wtedy "chomp" jest tym, czego chcesz. –