Làm thế nào để sao chép có chọn lọc các chi tiết từ một tệp và dán chúng vào một tệp mới?


11

Tôi có một tệp chứa thông tin cá nhân của tôi (.txt). Làm thế nào tôi có thể thông qua thiết bị đầu cuối chỉ sao chép một vài chi tiết từ tệp và đặt chúng vào một .txttệp mới ?

Ví dụ: nếu đây là nội dung của tệp:

name : farah age : 23 phone number : 0123 education : degree

Làm cách nào tôi chỉ có thể sao chép tuổi và số điện thoại và xuất chúng sang một .txttệp mới ?


2
Nó phụ thuộc vào những gì bạn muốn sao chép vào tập tin mới. Bạn có muốn một vài dòng đầu tiên, vài dòng cuối cùng chứa một chuỗi, không chứa một chuỗi, các dòng giữa hai chuỗi không? Có những công cụ để làm tất cả những điều này, nhưng chúng tôi cần biết những gì bạn muốn làm.
Arcege

Câu trả lời:


7

Có nhiều hướng khác nhau để làm điều đó. Nếu tập tin của bạn có một số cấu trúc được biết đến, bạn có thể sử dụng grep. Các greplệnh tìm kiếm một tập tin cho một cụm từ cụ thể và trả về dòng phù hợp với cụm từ đó. Vì vậy, nếu tập tin của bạn trông giống như

Tên: Sally

Ngày sinh: 7.31.76

Địa chỉ: 1234 Main St.

SSN: 123-45-6789

bạn có thể chạy grep Name info.txtvà nó sẽ trở lại Name: Sally. Sau đó, bạn có thể chuyển hướng đầu ra sang một tập tin khác. Gọi như vậy

grep Name info.txt > info2.txt

sẽ xuất dòng đến tập tin mới info2.txt. Nếu bạn muốn nối các dòng mới, bạn có thể làm

grep Address info.txt >> info2.txt

nếu không các tập tin sẽ được ghi đè.

Bạn cũng có thể học cách sử dụng trình soạn thảo văn bản dòng lệnh như vim.


2

Bạn có thể sử dụng grep để tìm kiếm một biểu thức chính quy trong chi tiết.txt và chuyển hướng kết quả sang tệp mới.

Nếu tất cả các dòng bạn muốn sao chép đều có điểm chung thì các dòng khác bạn không thể sử dụng:

grep "string in common" details.txt > new.txt

Nếu không, bạn sẽ phải tìm kiếm từng dòng bạn muốn sao chép, vẫn sử dụng grep và nối chúng vào new.txt bằng cách sử dụng >>thay cho >.


1

Ngoài ra còn có các trình soạn thảo hoạt động trong thiết bị đầu cuối, ví dụ như nano, vi và emacs.

Nếu bạn đang sử dụng giao diện người dùng đồ họa trên máy cục bộ và thiết bị đầu cuối trên máy từ xa, bạn cũng có thể sử dụng chuột để sao chép và dán từ một cửa sổ / tab thiết bị đầu cuối sang thiết bị thứ hai.


1

Giả sử tập tin đầu vào details.txtchứa:

name: farah
age: 23
phone number: 0123
education: degree

bạn có thể chọn dòng "tên" và "điện thoại" bằng grep mở rộng và chuyển hướng đầu ra sang new.txt:

grep -E "age:|phone number:" details.txt > new.txt

Điều này sẽ tạo ra new.txt với:

age: 23
phone number: 0123

Làm thế nào nó hoạt động:

Grep in chỉ phù hợp với dòng. Các -Etùy chọn kích hoạt regrec mở rộng cung cấp cho bạn khả năng sử dụng |(thay thế). Hãy nhớ trích dẫn toàn bộ mẫu, do đó |sẽ được giải thích bởi grep. Nếu không thì shell sẽ cố gắng diễn giải. Bạn không muốn điều này ở đây.


1

Tệp bạn đã hiển thị có tất cả các chi tiết trên một dòng:

name : farah age : 23 phone number : 0123 education : degree

Tôi đã giả sử rằng bạn có thể mã cứng age :vv vào lệnh, nhưng văn bản theo sau nó sẽ thay đổi và các chi tiết có thể không theo thứ tự nhất định hoặc không liền kề.

Bạn có thể trích xuất các bộ phận của phù hợp với grep's -ocờ. Điều này chỉ in phần phù hợp, chứ không phải toàn bộ dòng.

Nếu bạn muốn bao gồm các phần age :phone number :phần, bạn có thể sử dụng -ecờ để chỉ định nhiều kết quả khớp hoặc xen kẽ.

$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123

Biểu thức [^ ]*có nghĩa là bất kỳ số lượng ký tự không phải là khoảng trắng, do đó, nó khớp với các ký tự sau age :đến không gian tiếp theo.

Thay thế filebằng tên của tệp có chứa thông tin của bạn. Bạn có thể viết tệp mới bằng cách chuyển hướng đầu ra sang tệp mới với >toán tử, như sau:

grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile

Khi bạn làm điều đó, bạn sẽ không thấy bất kỳ đầu ra. Bạn nên kiểm tra đầu ra trước, sau đó thêm chuyển hướng.

Đây là ví dụ với sự xen kẽ. Chúng tôi sử dụng -Ecờ để nói grepđể sử dụng regex mở rộng. Cú pháp là (pattern1|pattern2)- điều này khớp pattern1và / hoặc pattern2. Nếu một trong hai được tìm thấy, nó sẽ được in (bất kể người khác có tìm thấy hay không). Bây giờ tôi đang sử dụng +ý nghĩa ít nhất một trong các ký tự trước, thay vì *có nghĩa bằng 0 hoặc nhiều hơn ký tự trước. Trong bối cảnh này, cả hai đều hoạt động tốt như nhau.

$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23 
phone number : 0123 

Nếu bạn muốn bỏ qua các phần age :phone number:phần, bạn có thể sử dụng -Pcờ để yêu cầu grepsử dụng các biểu thức chính quy tương thích Perl. Điều này hỗ trợ xen kẽ và cũng là một cách khớp văn bản sau một mẫu nhất định:

$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123

Nếu bạn muốn định dạng văn bản khác nhau, bạn có thể sử dụng sed, ví dụ:

$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123

Điều này phụ thuộc vào việc ageđến trước phone number, vì vậy điều chỉnh cho phù hợp nếu đó không phải là trường hợp. Nếu bạn không thể dựa vào thứ tự, bạn có thể sử dụng lệnh rất phức tạp này:

$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23

Điều này sắp xếp lại dòng để phone number :phần đến trước trên mỗi dòng, sau đó thực hiện thay thế thứ hai để chọn các chi tiết mong muốn. Tôi nợ kỹ thuật được sử dụng ở đây cho câu trả lời này của muru .

Ghi chú về sedcác lệnh không được giải thích trước đây

  • -rsử dụng regex mở rộng cho các lệnh dễ đọc hơn (GNU sedhiểu -Evới cùng nghĩa)
  • s/old/new/thay thế oldbằngnew
  • (pattern)lưu patternvào tham chiếu sau, với \1hoặc \2vv (tương ứng với thứ tự từ trái sang phải trong đó các nhóm chụp xảy ra - lưu ý rằng sedsẽ chỉ giữ tối đa 7 trong số này!).
  • .bất kỳ ký tự nào, do đó .*đại diện cho bất kỳ số lượng của bất kỳ ký tự.
  • ; tách các lệnh, như trong shell.
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.