2010-12-12 26 views
17

Tôi muốn một cách bash để đọc các dòng từ đầu vào tiêu chuẩn (vì vậy tôi có thể đầu vào đường ống cho nó), và loại bỏ chỉ các ký tự dấu cách hàng đầu và cuối. Piping to echo không hoạt động.Làm cách nào để cắt các đường được đọc từ đầu vào chuẩn trên bash?

Ví dụ, nếu đầu vào là:

 12 s3c 
    sd wqr 

đầu ra nên là:

12 s3c 
sd wqr 

Tôi muốn tránh phải viết một kịch bản python hoặc tương tự cho một cái gì đó như tầm thường như thế này. Bất kỳ trợ giúp được đánh giá cao!

Trả lời

20

Bạn có thể sử dụng sed để cắt nó.

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

Bạn có thể kiểm tra nó thực sự dễ dàng trên một dòng lệnh bằng cách thực hiện:

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

Hai quá trình sed là nặng cân không thoải mái. Tại sao không: 'sed 's/^ * //; s/* $ //''? –

+0

Hoạt động dựa trên dữ liệu mà anh đã cung cấp. Tôi đã cho bạn điểm cho điều đó! : D – phillip

+3

tại sao thậm chí không phải '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.. 

Để làm cho nó làm việc cho đầu vào đa dòng, chỉ cần thêm một vòng lặp while:

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

Sử dụng sed với chỉ một thay:

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

tôi thích cách tiếp cận tiện ích đơn giản. bạn cần phải sửa cú pháp trong khi: 'trim() {trong khi đọc-dòng; làm echo "$ line"; làm xong; } ' – Barak1731475

+0

@ user1731475: cố định, cảm ơn –

+1

Lưu ý rằng điểm của câu trả lời này là 'chỉ cần sử dụng lệnh đọc, nó sẽ cắt theo mặc định'. Việc sử dụng tiếng vang là hoàn toàn phù hợp với 'đầu ra phải là' điều kiện kiểm tra trong câu hỏi. Để xem cách KHÔNG nhận được hành vi được yêu cầu hoặc để hiểu tại sao nó là _possible_ điều này có thể không hoạt động, hãy xem [câu hỏi này] (http://stackoverflow.com/questions/7314044/use-bash-to-read-line-by -giây-và-giữ-không gian). – SensorSmith

3

Thêm này:
| sed -r 's/\s*(.*?)\s*$/\1/'

1

Tôi biết điều này là cũ, nhưng có một đơn giản và bẩn cách:

line=$(echo $line) 

Xem ví dụ sau:

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

Điều này bị hỏng: sẽ thất bại nếu có ký tự, và cũng sẽ nối các không gian liên tiếp. Không đề cập rằng 'echo' thường là một lựa chọn tồi (nếu, ví dụ: dòng bắt đầu bằng' -n', '-e' hoặc' -E'). –

+0

Làm việc cho tôi. Cảm ơn. – Geddon

1
your_command | xargs -L1 echo 

này hoạt động vì echo chuyển đổi tất cả tabls đến không gian và sau đó tất cả nhiều không gian để một không gian duy nhất, không chỉ ở đầu và đuôi, xem ví dụ:

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

Nhược điểm là nó cũng sẽ xóa một số ký tự hữu ích như \'".

+2

Điều này sẽ thất bại nếu có dấu gạch chéo ngược hoặc dấu ngoặc kép. –

Các vấn đề liên quan