Regex `/ pattern / g` và ed`: g / pattern / `: xuất hiện đầu tiên và tại sao` g`?


7

Các gtùy chọn (ví dụ s/pattern/replacement/g) đối với nhiều công cụ mà sử dụng regex kiểu mẫu phù hợp và các :glệnh trong ed, ex, vi, và vimcó sử dụng khá giống nhau và có nghĩa là: phù hợp với regex cho "toàn cầu", tức là, không dừng lại sau khi trận đấu đầu tiên.

Tôi có một câu hỏi hai lần về điều này:

  • Cái nào xuất hiện trước, :glệnh hoặc gcờ khớp mẫu và trong công cụ nào? Có vẻ như hầu hết các công cụ (như sed) sử dụng gcờ trong khớp mẫu của chúng thực sự chỉ là mô phỏng trực tiếp hoặc gián tiếp ed. Chẳng hạn, trong thời đại hậu Perl, hầu hết các công cụ sử dụng regex đều cho phép gcờ vì Perl thực hiện và Perl, nó sẽ xuất hiện, vì nó ed-> sed-> Perl. Vì vậy, tôi sẽ không ngạc nhiên nếu câu trả lời là "chúng được giới thiệu đồng thời trong edcông cụ ban đầu và không có tiền lệ lịch sử nào vượt quá điều đó".
  • Tại sao điều này được gọi là globaltùy chọn (hoặc lệnh)? Thực sự không có gì "toàn cầu" về nó; các :glệnh có một loạt các dòng giống như bất kỳ khác edlệnh, và glá cờ không mở rộng phạm vi tìm kiếm trong bất kỳ cách nào (nó chỉ cho phép nhiều hits). Tôi cho rằng tôi không thể nghĩ ra một cái tên hay hơn , nhưng cái được chọn có vẻ kỳ lạ đối với tôi, vì vậy tôi tự hỏi liệu có lý do nào cho nó mà tôi không nhìn thấy.

2
qed có lệnh G và lệnh S của nó không có cờ ag. Có vẻ như hành vi của lệnh S giống như những gì chúng ta đã biết là lệnh của ed với cờ g. cm.bell-labs.com/who/dmr/qedman.html cho biết, đối với lệnh S, "Sự xuất hiện của <regapi> trong các dòng được đánh dấu được thay thế bằng <chuỗi>"
Mark Plotnick

@MarkPlotnick Vâng, đó là câu trả lời phần một! Làm rất tốt
Kyle Strand


Lệnh ed (1) gmang tính toàn cầu ở chỗ nó áp dụng lệnh (thường là một dòng một lần) cho một số dòng.
vonbrand

Câu trả lời:


7

vi lấy cảm hứng từ ex , ex lấy cảm hứng từ ed , ed được lấy cảm hứng từ qed

QED đã bị hack bởi Ken Thompson trở lại vào cuối những năm 1960 cho "Hệ thống chia sẻ thời gian tương thích" của MIT (một phiên bản trước đó cho Hệ thống chia sẻ thời gian Berkeley được tạo ra bởi Butler Lampson, L. Peter Deutsch và Dana Angluin) - nói ngắn gọn là Thompson đã thêm regex vào qed (anh ấy đã làm nhiều hơn thế, nhưng nó nằm ngoài phạm vi của câu trả lời này. - Bell Labs có nhiều hơn về lịch sử của QED )

Một lệnh trong qed là lệnh "G" hoặc "Toàn cầu". Nó cho phép bạn hoạt động trên tất cả các dòng trong tệp cùng một lúc (phiên bản trước của qed là hướng nhân vật thay vì hướng dòng.)

Grep thực sự được đặt tên cho một trong những cách sử dụng lệnh này G / re / P ( Gtoàn cầu, rebiểu thức chính quy, Pin) trong qed Lệnh này được sử dụng như G/bash/Pđể in ra tất cả các dòng có chứa từ bash - sau đó được bao gồm trong ed, sau đó lấy ra khỏi ed và biến thành một chức năng độc lập (theo Doug McIlroy, anh ta yêu cầu Ken làm điều đó cho anh ta và Ken để nó trên bàn vào sáng hôm sau)


Như Mark Plotnick đã chỉ ra trong bình luận của mình về câu hỏi, qedthực ra cũng có glệnh.
Kyle Strand

Sai lầm. ex(1)là người thừa kế (dòng biên tập) ed(1), vi(1)chỉ là giao diện vi sual (toàn màn hình) ex(1). Bạn có thể đi đến trực quan từ ex, chúng là bí danh (thông thường /usr/bin/vi/usr/bin/exlà các liên kết cứng, với chương trình bắt đầu ở chế độ này hoặc chế độ khác tùy thuộc vào tên mà nó được gọi). Ngay cả ngày nay vim (VI iMproved, không liên quan đến mã gốc) được cài đặt trên Fedora /usr/bin/exnhư là một liên kết tượng trưng /usr/bin/vi. Các :lệnh viexcác lệnh.
vonbrand

4

Tôi tin rằng cả hai đến cùng một lúc ed, hoặc có thể QED. Chúng khá cơ bản để sử dụng ed. Nếu đã từng có một phiên bản không có cả hai, tôi không thể tưởng tượng nó sẽ hoạt động như thế nào.

g////glà hai điều hoàn toàn khác nhau. Và thực sự có một vài điều đang diễn ra ở đây.

  • //là để tìm kiếm dòng tiếp theo trong tệp có chứa mẫu, nó chỉ có thể trả về một dòng duy nhất (lưu ý 1,$/./không hợp lệ).
  • g//là để tìm kiếm một mẫu trên nhiều dòng, theo mặc định tất cả hoặc một phạm vi được chỉ định. Nó có thể trả về nhiều dòng.
  • //gmột mình là vô nghĩa và không phải là một lệnh hợp lệ trong ed(mặc dù một số công cụ khác chấp nhận nó, về mặt chức năng vẫn giống như vậy //).
  • s// là để thay thế phiên bản đầu tiên của mẫu trên (các) dòng hiện tại (hoặc được chỉ định).
  • s//g là để thay thế tất cả các phiên bản của một mẫu trên (các) dòng hiện tại (hoặc được chỉ định).

Tôi hy vọng rằng điều này ít nhất phần nào làm sáng tỏ sự nhầm lẫn. Nhưng tôi nghĩ rằng điểm chính của câu trả lời cho câu hỏi của bạn là đó là hai điều khác nhau. Mỗi cái được sử dụng cho một lý do khác nhau và có nghĩa là những thứ khác nhau.


Đầu tiên, qedkhông có bất kỳ hỗ trợ regex nào; đó là (theo một vài phiên bản khác nhau của câu chuyện) bước nhảy vọt chính ed. Vì vậy, tôi không chắc ý của bạn về việc không thể tưởng tượng được trình soạn thảo như vậy "sẽ hoạt động như thế nào" vì có rất nhiều lệnh chỉnh sửa khác.
Kyle Strand

Thứ hai, tôi nhận thức được sự khác biệt và tôi nghĩ rằng câu hỏi của tôi chỉ ra rằng nhận thức đó; đặc biệt, tôi đã nói rằng hai điều "có cách sử dụng và ý nghĩa khá giống nhau." Đây có lẽ là lý do tại sao họ chia sẻ cùng một chữ cái mặc dù trong một trường hợp glà tên lệnh (và được viết tắt rõ ràng từ "toàn cầu" trong tài liệu trợ giúp) và trong trường hợp khác, đó là một lá cờ (và, theo như tôi biết, không được nói rõ ràng là viết tắt của "toàn cầu" trong bất kỳ tài liệu biên tập nào - mặc dù Lập trình Perl , chẳng hạn, thực hiện liên kết này).
Kyle Strand

Dù sao, cảm ơn bạn đã giải thích về một số cách khác nhau regex có thể được sử dụng trong các lệnh biên tập. Tôi nghĩ rằng bằng cách hơi mơ hồ trong thuật ngữ của mình, tôi đã có ấn tượng về việc sử dụng nhiều hơn so với thực tế, vì tôi thực sự cảm thấy mình có một sự hiểu biết khá vững chắc về cách sử dụng regex trong Vim, sed, Perl, v.v; Tôi chỉ muốn hiểu lịch sử tốt hơn một chút. Tôi đã thực hiện một chỉnh sửa nhỏ cho câu hỏi ban đầu để cố gắng làm rõ điều này.
Kyle Strand

Lưu ý rằng bạn có thể nói ví dụ :20,200g/today/s/month/February/g...
vonbrand
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.