2010-12-12 12 views
17

Chcę bash sposób, aby odczytać linie ze standardowego wejścia (tak, że mogę potok wejścia do niego), i usunąć tylko początkowe i końcowe znaki spacji. Piping to echo nie działa.Jak przycinać linie odczytu ze standardowego wejścia na bash?

Na przykład, jeśli wejście jest:

 12 s3c 
    sd wqr 

wyjście powinno być:

12 s3c 
sd wqr 

chcę uniknąć pisania skryptu Pythona lub podobny do czegoś tak trywialnego jak ten. Każda pomoc jest doceniana!

Odpowiedz

20

Można użyć sed aby go przyciąć.

sed 's/^ *//;s/ *$//' 

Można przetestować go bardzo łatwo w wierszu poleceń, wykonując:

echo -n " 12 s3c " | sed 's/^ *//;s/ *$//' && echo c 
+9

Dwa procesy sed są niewygodne w wadze ciężkiej. Dlaczego nie: 'sed 's/^ * //; s/* $ //''? –

+0

To działa wbrew danym, które dostarczył. Dałem ci za to punkty! : D – phillip

+3

dlaczego nie nawet 'sed -r 's/* (. *) */\ 1/g''? –

17
$ trim() { read -r line; echo "$line"; } 
$ echo " aa bb cc " | trim 
aa bb cc 
$ a=$(echo " aa bb cc " | trim) 
$ echo "..$a.." 
..aa bb cc.. 

Aby pracować dla wejścia multi-line, wystarczy dodać while pętlę:

trim() { while read -r line; do echo "$line"; done; } 

Korzystanie sed tylko jeden substytucji:

sed 's/^\s*\(.*[^ \t]\)\(\s\+\)*$/\1/' 
+1

Podoba mi się proste podejście do narzędzi. musisz naprawić składnię while: 'trim() {while read -r line; wykonaj echo "$ line"; Gotowe; } ' – Barak1731475

+0

@ user1731475: naprawiono, dziękuję –

+1

Należy zauważyć, że punktem tej odpowiedzi jest" po prostu użyj polecenia odczytu, domyślnie będzie ono przycinane ". Użycie echa jest czysto dopasowane do "wyniku wyjściowego powinno być" warunkiem testowym w pytaniu. Aby zobaczyć, jak NIE uzyskać żądanego zachowania lub zrozumieć, dlaczego jest _possible_, to może nie działać, zobacz [to pytanie] (http://stackoverflow.com/questions/7314044/use-bash-to-read-line-by -line-and-keep-space). – SensorSmith

3

Dodaj to:
| sed -r 's/\s*(.*?)\s*$/\1/'

1

wiem, że to jest stary, ale jest inny prosty i brudne sposób:

line=$(echo $line) 

Zobacz przykład:

[email protected]:~$ x=" abc " 
[email protected]:~$ echo "+$x+" 
+ abc + 
[email protected]:~$ y=$(echo $x) 
[email protected]:~$ echo "$y" 
+abc+ 
+0

To jest zepsute: zawiedzie, jeśli pojawi się glob znaków, a także łączą kolejne spacje. Nie wspominając, że 'echo' jest zwykle złym wyborem (jeśli np. Linia zaczyna się od' -n', '-e' lub' -E'). –

+0

Działa dla mnie. Dzięki. – Geddon

1
your_command | xargs -L1 echo 

To działa, ponieważ echo konwertuje wszystkie tabls do przedziałów A potem wielokrotne spacje w jednej przestrzeni, nie tylko początkowe i końcowe, patrz przykład:

$ printf " 1\t\t\t2 3" 
    1   2 3 
$ echo `printf " 1\t\t\t2 3"` 
1 2 3 

Wadą jest to, że to usunie również niektóre użyteczne znaki, takie jak: \'".

+2

To się nie powiedzie, jeśli występują backslogi lub cytaty. –