Làm cách nào để xóa văn bản trước dấu phân cách trong Linux


16

Tôi cần xóa văn bản từ một dòng trước khi phân cách.

Ví dụ:

(123434): hello::{apple,orange,mango}.

Tôi cần xóa văn bản trước :. tức (123434).

Có lệnh nào trong linux để thực hiện tác vụ này không?


Bạn có thể muốn xem xét sedhoặcawk
Paul

Đây là một phần văn bản của một tập tin, hoặc một phần của biến bash?
Bernhard

Nó là một phần của tập tin.
dùng80538

Câu trả lời:


14

sedLệnh này nên thực hiện các mẹo. Lệnh sau sẽ ghi đè lên tệp:

sed -i 's/^[^:]*:/:/' file

Để chỉ in đầu ra, loại bỏ -icờ. Để đặt đầu ra trong một tệp mới, xóa -icờ và chuyển hướng đầu ra:

sed 's/^[^:]*:/:/' file > new_file

Dòng này đã làm nên điều kỳ diệu ... đầu ra được thay thế trong chính tệp ..
user80538

Khi tôi so sánh hai tệp bằng cách sử dụng sdiff, sau khi xóa văn bản khỏi cả hai tệp, sự khác biệt hiển thị cho tôi văn bản đã xóa cho tôi. lệnh này ghi đè tập tin hoặc chỉ hiển thị đầu ra.
dùng80538

Nó hoạt động .. Tôi có thể trích xuất 'hello' và {apple, cam, xoài} từ ví dụ của mình bằng cách thực hiện các thay đổi đơn giản trong lệnh trên không?
dùng80538

@ user80538, Thật khó để nói những gì bạn muốn khi bạn nói trích xuất trong ngữ cảnh này. Đây có phải là một phần của một kịch bản shell lớn hơn? Bạn có thể muốn hỏi một câu hỏi mới với các chi tiết về vấn đề lớn hơn mà bạn đang cố gắng giải quyết.
DRS

Nó chỉ là so sánh đơn giản của hai tệp có cùng dữ liệu nhưng chỉ cần tìm nơi dữ liệu khác nhau trong hai tệp. Tôi cần kiểm tra từng phần riêng lẻ trong dòng. Các dữ liệu trong các phần riêng lẻ có thể lộn xộn. như {apple, cam, xoài} có thể là {apple, xoài, cam}.
dùng80538

14

Bạn có thể sử dụng cut:

echo '(123434): hello::{apple,orange,mango}.' | cut -d: -f2-

5

Bạn có thể làm điều này với một lệnh Bash khá đơn giản :

mytext="(123434): hello::{apple,orange,mango}."

echo ${mytext#*)}

Điều này sẽ in : hello::{apple,orange,mango}.. Bạn có thể cắt tiền tố và hậu tố theo cách tương tự. Hơn nữa, định nghĩa tiền tố và hậu tố có thể chứa ký tự đại diện.

Cắt tiền tố - tối đa khớp với ký tự đại diện tiền tố đầu tiên: ${variable#prefix}

Cắt tiền tố - tối đa khớp với ký tự đại diện tiền tố cuối cùng: ${variable##prefix}

Cắt hậu tố - kết hợp ký tự đại diện hậu tố đầu tiên: ${variable%suffix}

Cắt hậu tố - cho đến cuối trận đấu ký tự đại diện: ${variable%%suffix}

Nó có thể trông không rõ ràng từ cái nhìn đầu tiên, xem ví dụ sau:

mytext="xAxBxAxBx"
echo ${mytext#*A}    # will print: xBxAxBx
echo ${mytext##*A}   # will print: xBx
echo ${mytext%B*}    # will print: xAxBxAx
echo ${mytext%%B*}   # will print: xAx
echo ${mytext%%C*}   # will print: xAxBxAxBx

Trong ví dụ cuối, mẫu không khớp, vì vậy không có gì bị cắt.


Nó sẽ mạnh mẽ hơn để sử dụng echo ${mytext#*:}:. Điều này sẽ xử lý đúng các dòng như (123)(434): hello::{apple,orange,mango}.123434: hello::{apple,orange,mango}.
drs

Có cách nào để sửa đổi lệnh echo $ {mytext %% B *} để lấy văn bản sau B. trong ví dụ của bạn
user80538

@ user80538 có, chỉ cần cắt văn bản trước B, bao gồm ;-), tức là: $ {mytext # * B} cho văn bản sau B đầu tiên và $ {mytext ## * B} cho văn bản sau B.
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.