Điểm:1

Chỉ áp dụng các thao tác sed cho các dòng bắt đầu bằng một chuỗi cụ thể

lá cờ bd

Tôi có định dạng tệp sau

Đã nhận từ +11231231234 lúc 2021-10-10T19:56:50-07:00:
Đây là một tin nhắn có chứa các từ như from, at, v.v.

Gửi tới +11231231234 lúc 2021-10-11T06:50:57+00:00:
Đây là một tin nhắn khác có chứa các từ như to, at, v.v.

Tôi muốn xóa các dòng "Đã nhận" và "Đã gửi", các lệnh sed sau đây đạt được điều này

tệp mèo | sed 's/từ//g' | sed 's/to/ /g' | sed 's/+\w\+//' | \ 
sed 's/at//g' | sed 's/T/ /g' | sed 's/[[:digit:].]*\:$//' | \ 
sed 's/[[:digit:].]*\:$//' | sed 's/-$//' | sed 's/-$//' | sed 's/+$//'

và kết quả như sau

Đã nhận 2021-10-10 19:56:50
Đây là một tin nhắn có chứa các từ như , , v.v.

Đã gửi 2021-10-11 06:50:57
Đây là một tin nhắn khác có chứa các từ như , , v.v.

Như bạn có thể thấy, nó làm sạch các dòng "Đã nhận" và "Đã gửi" một cách độc đáo. Nhưng nó cũng dọn sạch các dòng tin nhắn! Làm cách nào tôi chỉ có thể áp dụng các thao tác này trên các dòng bắt đầu bằng "Đã nhận" và "Đã gửi"?

lá cờ tm
Được đăng chéo lên [Unix & Linux](https://unix.stackexchange.com/q/679965/13792)
Điểm:2
lá cờ in

Bạn có thể sử dụng một mẫu để chọn những dòng sẽ áp dụng lệnh tiếp theo:

sed '/^Đã gửi\|^Đã nhận/ s/mẫu/thay thế/' your_file

Thưởng

Bạn thực sự có thể thực hiện tất cả các chỉnh sửa của mình trong một lệnh sed tuyệt vời:

sed '/^Đã nhận\|^Đã gửi/ s/\(^[^ ]*\).*at \(.*\)T\(.*\)[-+].*/\1 \2 \3 /' tập tin của bạn

Về cơ bản, mẫu phù hợp với mọi đoạn văn bản trên dòng và chúng tôi chỉ 'ghi nhớ' tất cả các bit chúng tôi muốn giữ lại, sau đó thay thế toàn bộ dòng bằng họ.

Đầu ra:

Đã nhận 2021-10-10 19:56:50
Đây là một tin nhắn có chứa các từ như from, at, v.v.

Đã gửi 2021-10-11 06:50:57
Đây là một tin nhắn khác có chứa các từ như to, at, v.v.

Cách nó hoạt động như sau:

  • \(\) là 'các nhóm chụp' ghi nhớ bất cứ thứ gì được khớp trong giữa họ.
  • ^[^ ]* khớp với phần đầu của một dòng theo sau bởi bất kỳ số nào các ký tự không phải khoảng trắng liên tiếp (tức là từ đầu tiên trên dòng).
  • .*tại khớp với mọi thứ cho đến và bao gồm cả từ 'at' (và dấu cách theo sau nó) - đây không phải là một nhóm chụp và do đó không được 'ghi nhớ'.
  • \(.*\)T nhớ (trong nhóm chụp thứ hai) mọi thứ cho đến, nhưng không bao gồm cả chữ 'T' viết hoa.
  • \(.*\)[-+].* nhớ (trong nhóm chụp thứ ba) mọi thứ cho đến, nhưng không bao gồm, '-' hoặc '+' (và bất kỳ thứ gì theo sau '-/+').
  • /\1 \2 \3/ có nghĩa là thay thế trận đấu (tức là toàn bộ dòng) bằng nội dung của nhóm nắm bắt thứ 1, 2 và 3.

Trang này giải thích sed rất tốt - nó cũng có một bộ tuyệt vời unix khác hướng dẫn.

jf4i2d avatar
lá cờ bd
cảm ơn người đàn ông gợi cảm

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.