Cách xóa một ký tự cụ thể trong một chuỗi nhưng chỉ khi không có số nào trong dòng đó trong Linux


8

Tôi đã bị bối rối với vấn đề có vẻ đơn giản để khắc phục này .. tốt, trong một thời gian.

Đây là ví dụ đầu ra từ tệp tôi cần chỉnh sửa:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

Tôi cần xóa khoảng cách giữa "George Washington" và "Công ước Geneva", nhưng không phải khoảng cách giữa "123,281,029 USD" hoặc "342,019,929 EUR".

Về cơ bản, mục tiêu của tôi ở đây là chỉ xóa khoảng trắng giữa các từ trong một dòng CHỈ nếu không có số nào trong dòng đó.

Tôi đã cố chỉnh sửa tệp qua grep -v [0-9] $file | sed 's/ //', nhưng cách duy nhất sẽ hoạt động là nếu tôi xuất ra tệp khác, nhưng điều đó có nghĩa là loại trừ tất cả các dòng có số từ tệp cũ sang tệp mới, đó không phải là thứ tôi cần ..

Tôi đã thử một số vòng lặp khá lố bịch với grep và seddường như không có gì hoạt động tốt cả.

Một lần nữa, đây là đầu ra ví dụ của tệp:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

Đây là đầu ra mong muốn của tôi:

$cat file
GeorgeWashington
GenevaConvention
123,281,029 USD
342,019,929 EUR

Câu trả lời:


15

Sử dụng sed:

sed '/[0-9]/!s/ //g' filename

Điều này sẽ xóa khoảng trắng trên tất cả các dòng không chứa chữ số.

Sử dụng awk:

awk '!/[0-9]/{gsub(" ", "", $0)};1' filename

Để chỉ xóa khoảng trắng giữa hai từ đầu tiên (ở đây sử dụng GNU sedcho -r, -Ethay vào đó hãy sử dụng trên BSD):

sed -r '/[0-9]/!s/([^ ]+) ([^ ]+)/\1\2/' filename

Hoàn hảo! Điều này thật đúng với gì mà tôi đã tìm kiếm! Không thể tìm thấy cú pháp ở bất cứ đâu cho phần "/ [0-9] /! S /". Cảm ơn rât nhiều.
dùng62129

@ user62129 - nếu câu trả lời này giải quyết vấn đề của bạn, vui lòng dành một phút và kiểm tra dấu kiểm dưới số phiếu bầu ở bên trái, điều này sẽ biểu thị cho mọi người rằng vấn đề của bạn đã được giải quyết.
slm


4

Đối với cách tiếp cận tổng quát hơn, chỉ xóa những khoảng trắng nằm giữa hai chữ cái. Bằng cách đó, nó có thể hoạt động ngay cả khi các dòng có chữ số, nó chỉ bỏ qua khoảng trắng xung quanh các số:

perl -pe 's/([a-z])\s+([a-z])/$1$2/ig' file

Điều đó sẽ, ví dụ, chuyển George and Harry 12 EURsang GerogeandHArry 12 EURvà vẫn hoạt động chính xác cho các trường hợp trong ví dụ của bạn.

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.