2009-10-20 3 views
8

File1:Sử dụng sed để xóa tất cả các hàng đầu/khoảng trống sau đây trong một tập tin văn bản

hello 
    world 

Làm thế nào người ta sẽ xóa các khoảng trống hàng đầu/đuôi trong tập tin này bằng sed - bằng một lệnh (không tập trung gian)?

tôi hiện có:

sed -e 's/^[ \t]*//' a > b 

Đối với không gian hàng đầu.

sed 's/ *$//' b > c 

Và điều này cho khoảng trống cuối.

+0

Trong khi câu trả lời của @ ghostdog74 là câu trả lời hay nhất, câu trả lời của @ mouviciel là câu trả lời đúng * theo câu hỏi của bạn. Tôi upvoted cả hai, nhưng tôi tin rằng @mouviciel xứng đáng được chấp nhận như là câu trả lời đúng. –

+0

Bạn đúng - mouviciel hiện đã được chấp nhận. Nhờ có cả hai mouviciel (câu trả lời đúng) và ghostdog74 (chỉ đường đến awk) cho thời gian của họ! – user191960

Trả lời

10

Bạn hầu như đã nhận nó:

sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c 

Hơn nữa trên một số hương vị của sed, đó cũng là một tùy chọn để chỉnh sửa nội tuyến:

sed -i -e 's/^[ \t]*//;s/[ \t]*$//' a 
+3

Tôi cũng xem xét kết hợp '\ s' là 'tất cả các ký tự khoảng trắng' chung chung. –

+0

Không phải là 'sed -e' s/^ [\ t] * //; s/[\ t] * $ // 'a> c'? –

+0

Tôi vẫn thấy 'sed -e 's/^ [\ t] * //; s/[\ t] * $ /' a> c' không hoạt động đối với tôi (bash phiên bản 4.3.30, Funtoo-Linux). –

7

dễ dàng hơn bằng cách nào, sử dụng awk

awk '{$1=$1}1' file 

hoặc

awk '{gsub(/^ +| +$/,"")}1' file 
+0

Người đầu tiên làm việc một cách hoàn hảo và đơn giản nhất - tôi biết nó không phải những gì tôi hỏi (tức là sed) - nhưng nó rất tao nhã :). Tôi sẽ nhìn vào lúc này. – user191960

+0

Thứ nhất loại bỏ tất cả các khoảng trắng giả, không chỉ dẫn đầu và theo sau.Cách thứ hai hoạt động tốt nhất. 'awk' là một công cụ tuyệt vời. – mouviciel

+0

Ah, tôi thấy các không gian khác đã bị xóa với dấu cách đầu tiên - thứ hai hoạt động mà không bị xóa thêm. – user191960

3
perl -lape 's/^\s+|\s+$//g' 

Thành thực mà nói, tôi biết perl regexps là tốt nhất, vì vậy tôi tìm perl -lape dễ dàng hơn để sử dụng hơn sed -e.

Ngoài ra, để trả lời câu hỏi ban đầu, bạn có thể đã sed thực hiện nhiều hoạt động như thế này:

sed -e 's/something/something else/' -e 's/another substitution/another replacement/' 

Rõ ràng bạn cũng có thể đặt hai thay thế trong một chuỗi và tách chúng bằng dấu chấm phẩy, như đã nêu trong một câu trả lời khác.

0

Lưu ý rằng trong trường hợp tổng quát hơn của việc áp dụng nhiều bộ lọc trong một hàng để một tập tin đầu vào mà không sử dụng các file trung gian, giải pháp là sử dụng ống:

sed -e 's/^[ \t]*//' a | sed -e 's/ *$//' > c 

Rõ ràng là họ không phải ở đây vì một invocation của sed là đủ, nhưng nếu lệnh sed thứ hai là một cái gì đó khác nhau, như uniq hoặc sắp xếp, sau đó mô hình này là một trong những quyền.