Làm cách nào để thay thế văn bản giữa hai điểm đánh dấu trong một tệp bằng một phần văn bản từ một tệp khác?


8

Nói rằng tôi đã có một khối văn bản trong ~/.bashrc:

#~/.bashrc
# ...some commands...

# aliases
alias suicide='sudo rm -rf /'
# end aliases

# other commands

Tôi muốn thay thế khối văn bản đó bằng một số văn bản khác có giữa hai điểm đánh dấu trong một tệp khác: stuff-to-place-in-bashrc.txt

# stuff-to-place-in-bashrc.txt
# ...stuff...

# aliases
alias ldir='ls * -d'
alias ithinklifeisworthliving='echo all good'
# end aliases

# ...more stuff...

Tôi đã thử

 sed -ne 's/# aliases\s+\(.*\)\s+# end aliases/\1/' stuff-to-place-in-bashrc.txt

Nhưng tôi thực sự đung đưa trong bóng tối ở đây. ai đó có thể giúp tôi không?

  1. Làm thế nào để tôi trích xuất văn bản từ stuff-to-place-in-bashrc.txt?

  2. Làm cách nào để thay thế phần khác ~/.bashrcbằng văn bản trích xuất từ ​​câu hỏi 1?

Biên tập

Cảm ơn những người cập nhật, những người tự hỏi tại sao tôi lại muốn một cái gì đó như thế này:

cho phép các bản cập nhật được chọn bằng cherry vào các tệp script mà không ghi đè các bổ sung do người dùng tạo. hữu ích cho các môi trường hoạt động tiêu chuẩn được chia sẻ và cập nhật thường xuyên (như công việc cuối cùng của tôi tại Tyro được mã hóa bằng XP).

kẻ điên


Cũng xem Chụp văn bản giữa các dấu ngoặc nhọn trong tệp C được xử lý trước . Thay đổi "dấu ngoặc nhọn" bằng mã thông báo bắt đầu và kết thúc ( # aliases# end aliases) và nó có thể phù hợp với bạn.

Câu trả lời:


9

Ed là trình soạn thảo tiêu chuẩn, bởi vì bạn có thể sử dụng nó để phát triển các tập lệnh ed và để nó thực hiện công việc của nó, như bạn đã thử nghiệm trước đó, một cách tương tác. Đối với các tệp nhỏ như .bashrchoặc bất kỳ văn bản mã nào, ed là biểu diễn vì nó đọc toàn bộ tệp một cách vội vàng và hoạt động với bộ đệm. Vì lý do tương tự, bạn không nên sử dụng ed cho các tệp lớn như tệp nhật ký.

Nhưng với một kịch bản ed, công việc của bạn được thực hiện trong thời gian ngắn:

ed ~/.bashrc<<EOF
/^# aliases
+,/^# end aliases/-1d
-r !sed -n '/^# aliases/,/^# end aliases/p' stuff-to-place-in-bashrc.txt|grep -v '^#'
w
q
EOF

Tôi sử dụng các tập lệnh tương tự để tự động điều chỉnh các tệp cấu hình, chẳng hạn như .asoundrc cho các môi trường khác nhau mà tôi mang máy tính xách tay của mình đến.

Tài liệu tốt nhất về ed xuất hiện dưới dạng một trang hướng dẫn đơn giản từ hệ thống PLAN9 rất tuyệt vời . Tôi đã dịch nó sang một tài liệu tái bút ed.ps. Nếu bạn quan tâm đến PLAN9, bạn nên kiểm tra 9fronthttp://cat-v.org/ vì phiên bản phòng thí nghiệm chuông ban đầu vẫn được duy trì nhưng có hệ thống tệp rất đơn giản.

Một từ cuối cùng về cuộc chiến biên tập, emacs, vim và tương tự: quy tắc acme!


Cảm ơn câu trả lời, Nó đã hoạt động, tuy nhiên tôi không chắc cú pháp là gì. Nó sử dụng regex hoặc một cái gì đó cụ thể hơn để ed? có vẻ như có vim như các lệnh ( w, q)
thenaglecode

Nó sử dụng regexes ( /^# aliases/^# end aliases/) và các lệnh khác là Vi / Ed. Xem, ví dụ: vimhelp.appspot.com/cmdline.txt.html#%3Arange cho +, /^# end aliases/.
muru

1
xem info Edtrên hệ thống của bạn (hy vọng). Tôi không biết tại sao các bản phân phối linux hiện đại không cài đặt trình soạn thảo tuyệt vời này. w và q là các lệnh ghi và thoát. Và ed hoạt động rất giống với sed với regexes. Có một lý do tại sao các tên âm thanh tương tự. d có nghĩa là xóa các dòng được nhấn, -r đọc vào dòng trước kết quả của !lệnh tiếp theo. Tôi rút ngắn tên tập tin trong bản chỉnh sửa, vì tôi rất lười gõ vào sáng sớm hôm nay.
ikrabbe

1
@thenaglecode xem bản chỉnh sửa cuối cùng của tôi. Tôi đã phải kiểm tra điều đó trước khi tôi đăng nó.
ikrabbe

1
@thenaglecode Trang duy nhất và duy nhất về ed tôi từng cần là trang ed (1) từ plan9: man.cat-v.org/plan_9/1/ed Tôi có thể gửi cho bạn phiên bản mô tả nếu bạn muốn. Như chúng ta chỉ nói về plan9, hãy xem Trình chỉnh sửa acme. Nếu bạn quen với điều đó, bạn sẽ không bao giờ sử dụng cái gì khác. Tất nhiên, tốt nhất là sử dụng hệ thống plan9, ví dụ như một máy ảo bên trong hộp linux của bạn, nhưng cổng p9p cho unix cũng rất tuyệt. (Có rất ít sự khác biệt giữa plan9 ed và gnu ed!)
ikrabbe

2
set /^\#aliases/  /^\#end\ aliases/
sed -ne"$1,$2"'s/\\\{0,1\}/&&/gp' <stuff_to_place...rc |
sed -e"$1,$2c\" -f- ./infile >./outfile

Nếu bạn muốn chỉnh sửa tập tin tại chỗ edlà một giải pháp rất tốt. Nếu bạn muốn chỉnh sửa nó trong luồng, sử dụng sed. Tránh sed -i.


0

Chắc chắn, bạn có thể làm điều này với edmột mình, không cần thêm công cụ:

ed -s stuff_to_place.txt<<\IN
1,/# aliases/d
/# end aliases/,$d
,d
.r /home/username/.bashrc
/# aliases/x
.t.
.,/# end aliases/-d
,p
q
IN

nếu bạn hài lòng với kết quả này, hãy thay thế ,pbằng w /home/username/.bashrccách viết các thay đổi vào ~/.bashrc(lưu ý đường dẫn đầy đủ được sử dụng với rw; bạn chỉ có thể sử dụng .bashrcnếu có cwd).
Làm thế nào điều này hoạt động: đầu tiên chúng ta dbỏ qua các dòng không cần thiết từ stuff_to_place.txt. Sau đó, chúng tôi xóa những cái còn lại (bí danh) với ,d. Bộ đệm văn bản hiện trống trong khi bộ đệm cắt chứa các dòng chúng ta muốn. Sau đó, chúng tôi rđọc nội dung của .bashrcbộ đệm văn bản, đặt nội dung của bộ đệm đã cắt ( x) vào sau /# aliases/dòng, sao chép dòng cuối cùng được dán ( .t.) sau đó xóa khỏi dòng trùng lặp lên nhưng không bao gồm /# end aliases/và cuối cùng là print hoặc wnghi thức thay đổi và quit.

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.