Xóa khoảng trắng đầu tiên trong một dòng


7

Làm cách nào tôi chỉ có thể xóa khoảng trắng đầu tiên khỏi một dòng như bên dưới mà không xóa các khoảng trắng khác trong cùng một dòng?

Ví dụ đầu vào:

2015-04-18 10:21:59 10 05430 -9999 -9999 000000000000

Kết quả ví dụ:

2015-04-1810:21:59 10 05430 -9999 -9999 000000000000

Câu trả lời:


2

Sử dụng awk:

> awk '{print $1$2,$3,$4,$5,$6,$7}' yourfile > outputfile

Đầu ra:

> cat outputfile

2015-04-1810:21:59 10 05430 -9999 -9999 000000000000

Bạn có thể xóa bất kỳ khoảng trống nào trong dòng và giữ bất kỳ khoảng trống nào

Giả sử : Tệp đầu vào phải chứa:

  1. không có khoảng trắng hàng đầu
  2. không có không gian liên tiếp
  3. không có tab
  4. tổng số ít hơn bảy không gian

Nếu bất kỳ giả định này bị vi phạm, kết quả sẽ không chính xác


7
Bị từ chối vì điều này hoàn toàn phụ thuộc vào các giả định sau: Tệp đầu vào phải chứa (1) không có khoảng trắng hàng đầu (2) không có khoảng trắng liên tiếp (3) không có tab (4) tổng ít hơn bảy khoảng trắng. Nếu bất kỳ giả định nào trong số này bị vi phạm, lệnh sẽ thực hiện một điều hoàn toàn khác với hành động được yêu cầu: "Xóa khoảng trắng đầu tiên khỏi mỗi dòng (không có thay đổi khác)."
tự đại diện

1
Các giải pháp thích hợp đã được đăng . Câu trả lời này thực sự không chính xác.
tự đại diện

4
Hãy nhớ rằng trang web này tồn tại để phục vụ độc giả trong tương lai , không chỉ người hỏi hiện tại. Vì vậy, đây là một câu trả lời rất sai lệch cho "Làm cách nào để xóa khoảng trắng đầu tiên khỏi mỗi dòng của tệp?" Ít nhất bạn nên bao gồm các giả định sau câu trả lời với một ghi chú, cảnh báo.
tự đại diện

2
@Wildcard một lần nữa bạn nói đúng, tôi đã chỉnh sửa câu trả lời của mình.
Wissam Roujoulah

3
Thay vì tất cả sự dài dòng này, bạn có thể đã sử dụng sub()chức năng, chỉ loại bỏ kết quả khớp đầu tiên trong dòng, do đó biểu thức awk dài của bạn có thể được giảm xuốngawk '{sub(/ /,"")};1' input.txt
Sergiy Kolodyazhnyy

19

Bạn có thể sử dụng sedcho việc này:

sed 's/ //' infile >outfile

Điều này áp dụng thay thế cho tất cả các dòng của tệp infilesẽ thay thế ký tự khoảng trắng đầu tiên bằng không có gì (tức là loại bỏ nó). Đầu ra được lưu trữ trong tập tin outfile. Với sed 's/ //N', Nsố nguyên nằm trong khoảng từ 1 đến 9, bạn có thể chọn khoảng trống cần xóa.

Nếu dòng nằm trong biến shell, bạn có thể sử dụng

var="${var/ /}"

Điều này sử dụng ${parameter/pattern/string}mở rộng tham số bashđể thực hiện tương tự như sedlệnh, nhưng trên giá trị trong $var. Chuỗi kết quả là, trong ví dụ này, sau đó được lưu trữ trở lại $var.


1

Bạn có thể sử dụng Vim trong chế độ Ex:

ex -sc '%s/ //|x' file
  1. % chọn tất cả các dòng

  2. s thay thế

  3. x lưu và đóng


0

Perl một lớp nhỏ và đơn giản:

$ perl -ane 'printf "%s",@F[0];@F[0]="";print @F'  <<< "2015-04-18 10:21:59 10 05430 -9999 -9999 000000000000"                        
2015-04-1810:21:591005430-9999-9999000000000000

Hoặc thậm chí đơn giản hơn theo đề xuất của mik trong các bình luận:

perl -pe 's/ //' <<< "2015-04-18 10:21:59 10 05430 -9999 -9999 000000000000"

Python cũng có thể làm điều đó. Đây là một kịch bản nhỏ thực hiện công việc. Nó có thể được giảm xuống một lớp lót, nếu cần thiết:

#!/usr/bin/env python
from __future__ import print_function
import sys
for line in sys.stdin:
    words=line.strip().split()
    print(words[0],end="")
    print(" ".join(words[1:]))

Và với cùng một dòng trong tệp đầu vào được nhân đôi 3 lần, đây là một thử nghiệm cho đầu vào nhiều dòng:

$ ./remove_leading_space.py < input.txt                                                                                               
2015-04-1810:21:59 10 05430 -9999 -9999 000000000000
2015-04-1810:21:59 10 05430 -9999 -9999 000000000000
2015-04-1810:21:59 10 05430 -9999 -9999 000000000000

Nếu bạn chỉ chỉnh sửa một dòng duy nhất, bạn có thể làm như vậy:

$ ./remove_leading_space.py <<< "2015-04-18 10:21:59 10 05430 -9999 -9999 000000000000"                                               

1
Một perloneliner nhỏ và đơn giản sẽ làperl -pe 's/ //'
mik

@mik Cảm ơn bạn. Chỉnh sửa thành câu trả lời. Vẫn đang học perl, vì vậy hãy làm tốt nhất có thể với những gì tôi có :)
Sergiy Kolodyazhnyy

-1

Đó là một câu hỏi khá đơn giản.

sed -i 's/ //' /path/to/file

Hãy thử lệnh này và không thêm s vào cuối biểu thức sed.

Nó sẽ chỉ loại bỏ không gian đầu tiên mỗi dòng.


2
Điều này khác với Kusalananda như thế nào?
don_crissti

@don_crissti trong khi sử dụng -ibạn có thể gõ ít hơn. Và -ilà cách chính thức được đề xuất nếu bạn chỉ muốn thay đổi tệp văn bản trực tiếp.
TJM

3
Vâng, anh chàng tiếp theo sẽ thêm một -evà nói nó cũng khác ...
don_crissti

@don_crissti Tại sao không? Tôi nghĩ rằng nó sẽ cung cấp nhiều thông tin hữu ích hơn cho những người gặp rắc rối như người hỏi.
TJM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.