Làm cách nào để xóa các dòng khỏi tệp văn bản chứa các từ cụ thể thông qua thiết bị đầu cuối?


72

Làm cách nào để xóa tất cả các dòng khỏi tệp văn bản có chứa các từ "cat" và "rat"?


Điều này nghe có vẻ đáng ngờ giống như một bài tập về nhà. Hãy nhớ ghi câu trả lời của bạn cho những người tốt bụng tại Askubfox.
zwets

Đó là một phần của dự án lớn, tôi chưa quen với môi trường Linux.
PersonX

Câu trả lời:


100

grep tiếp cận

Để tạo một bản sao của tệp không có dòng khớp với "cat" hoặc "rat", người ta có thể sử dụng grepngược lại ( -v) và với tùy chọn toàn từ ( -w).

grep -vwE "(cat|rat)" sourcefile > destinationfile

Tùy chọn toàn từ đảm bảo rằng nó sẽ không khớp catshoặc gratefulví dụ. Chuyển hướng đầu ra của shell của bạn được sử dụng ( >) để ghi nó vào một tệp mới. Chúng ta cần -Etùy chọn để kích hoạt các biểu thức chính quy mở rộng cho (one|other)cú pháp.

sed tiếp cận

Ngoài ra, để loại bỏ các dòng tại chỗ, người ta có thể sử dụng sed -i:

sed -i "/\b\(cat\|rat\)\b/d" filename

Các \branh giới bộ văn bản và các dhoạt động xóa các dòng phù hợp với khái niệm giữa các dấu gạch chéo. catratcả hai đều được khớp với (one|other)cú pháp mà chúng ta rõ ràng cần phải thoát bằng dấu gạch chéo ngược.

Mẹo: sử dụng sedmà không có -itoán tử để kiểm tra đầu ra của lệnh trước khi ghi đè tệp.

(Dựa trên Sed - Xóa một dòng có chứa một chuỗi cụ thể )


Tôi tự hỏi liệu có cách nào để đạt được cả việc xóa khỏi tệp nguồn VÀ tạo tệp có khớp không. Có thể là không, nhưng nó sẽ hữu ích (ví dụ: khi bạn nhận được một tệp đang phát triển quá lớn, bạn sẽ chia nó dựa trên nội dung).
Sridhar Sarnobat

1
@ Sridhar-Sarnobat Ồ, bạn có thể. Sử dụng tee và subshells để sao chép thiết bị xuất chuẩn. Trong một bạn lọc, trong một ngược lại. Việc sử dụng tee và subshells được thể hiện trong một usecase không liên quan được trình bày ở đây: blog.g3rt.nl/ Kẻ
gertvdijk

15

Để chỉ kiểm tra trong thiết bị đầu cuối, sử dụng:

sed '/[cr]at/d' file_name

Để thực sự xóa những dòng đó khỏi tệp, sử dụng:

sed -i '/[cr]at/d' file_name

5

Hãy thử cách vim:

ex +"g/[cr]at/d" -scwq file.txt

0

Xem xét nếu bạn có tập tin với file_namevà bạn muốn tìm kiếm cho chuột nhưng trên cùng một lúc vài dòng từ chuột có Nói cách khác như catratvà bạn không muốn nhìn thấy những người ở đầu ra của bạn, vì vậy một trong những cách để làm điều đó là -

grep -r mouse file_name | grep -vE "(cat|rat)"

0

cách vỏ di động

Làm việc tại /bin/sh, đó là dashtrên Ubuntu, cũng như ksh, và bash. Hơi khó xử khi bạn phải viết nhiều trường hợp kiểm tra cho mỗi từ trong casecâu lệnh nhưng di động. Hoạt động với các trường hợp từ xuất hiện một mình trên dòng, ở đầu, cuối dòng hoặc giữa dòng và bỏ qua nơi nó có thể là một phần của từ khác.

#!/bin/sh
line_handler(){
   # $1 is line read, prints to stdout
    case "$1" in
        cat|cat\ *|*\ cat\ *|*\ cat) true;; # do nothing if cat or rat in line
        rat|rat\ *|*\ rat\ *|*\ rat) true;; 
        *) printf "%s\n" "$1"
    esac
}

readlines(){
    # $1 is input file, the rest is words we want to remove
    inputfile="$1"
    shift

    while IFS= read -r line;
    do
        line_handler "$line" "$@"
    done < "$inputfile"
    [ -n "$line" ] && line_handler "$line" 
}

readlines "$@"

Và đây là cách nó hoạt động:

$ cat input.txt                                                                                                                                                        
the big big fat cat
the cat who likes milk 
jumped over gray rat
concat 
this is catchy
rat
rational
irrational
$ ./dellines.sh input.txt                                                                                                                                              
concat 
this is catchy
rational
irrational
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.