Tìm kiếm và thay thế các ký tự điều khiển (^ @, ^ M, ^ I]) trong vi


14

Tôi đã sao chép dòng này từ /proc/some_proc_id/cmdlinetrong máy ubfox của tôi,

java^@-jar^@/usr/lib/selenium/selenium-server-standalone.jar^@-port^@4444^@-trustAllSSLCertificates^@

Bằng cách nào đó, các ký tự không gian được thể hiện bằng ^@vi. Tôi đã cố gắng thay thế chúng bằng các ký tự khoảng trắng bằng cách sử dụng lệnh,

:%s#^@# #g

Nhưng nó nói , pattern not found ^@.

Làm thế nào người ta có thể thay thế các ký tự đặc biệt, đặc biệt là những ký tự bắt đầu bằng biểu tượng carat?


Loại thiết bị đầu cuối bạn đang sử dụng là gì?
Ed Heal

đôi khi, TERMvà nhiều lần, đó làscreen

Chương trình đầu cuối bạn đang sử dụng là gì và TERMbiến môi trường có được đặt chính xác không?
Ed Heal

Câu trả lời:


15

Bằng cách nào đó, các ký tự không gian được thể hiện bằng ^@vi.

Đó không phải vilà điều đó. Mặc dù bạn nhập các dòng lệnh trong shell với khoảng trắng giữa các đối số, các dòng lệnh thực sự là các chuỗi riêng biệt của các chuỗi bên trong, không phải là một chuỗi dài được phân tách bằng dấu cách. Shell tách dòng lệnh thành các chuỗi đối số riêng lẻ trước khi lệnh được khởi chạy.

Trong C, các chuỗi được kết thúc bằng các ký tự NUL và các chuỗi được hiển thị dưới dạng ^@.

Làm thế nào người ta có thể thay thế các ký tự đặc biệt, đặc biệt là những ký tự bắt đầu bằng biểu tượng carat?

Để nhập các ký tự đó, bạn phải đặt tiền tố cho chúng Control- vcho ký tự tiếp theo theo nghĩa đen.

Ví dụ trong trường hợp này: Control- vtheo sau là Control- @.

Các ký tự đặc biệt giới thiệu các ký tự tiếp theo theo nghĩa đen là bình thường Control- vnhưng nó thực sự có thể cấu hình được. Nhập stty -ađể tìm hiểu những gì nó được thiết lập. Tìm kiếm lnexttrong đầu ra.


bài viết có nhiều thông tin .. nhưng giải pháp thực sự cho câu hỏi của tôi là thoát khỏi biểu tượng carat - :%s#^@##g. Kể từ khi tôi sao chép, dán từ thiết bị đầu cuối, vi đã dán chúng dưới dạng ký tự gốc ...

1
@MadhavanKumar Bạn không thoát khỏi biểu tượng dấu nháy, bởi vì có không có biểu tượng dấu nháy. Đó thực sự là một nhân vật điều khiển thực tế. ^letterchỉ là ký hiệu trực quan cho điều đó, không có sự quan tâm thực sự liên quan. Và vâng, bạn phải thoát khỏi ký tự điều khiển, Ctrl-V là cách bạn làm điều đó từ bàn phím. Điều đó làm việc hầu hết mọi nơi. FYI, câu trả lời khác chứa một dòng thay thế, cụ thể cho vidòng lệnh của, để tránh phải nhập ký tự điều khiển.
Celada

@MadhavanKumar Nếu thiết bị đầu cuối của bạn hiển thị các ký tự NUL dưới dạng chuỗi hai ký tự ^@và bạn đã sao chép-dán, sau đó sử dụng \^@để thể hiện chuỗi hai ký tự đó bằng vi. Rất nhiều phần mềm sử dụng dấu gạch chéo ngược có nghĩa là diễn giải các ký tự tiếp theo theo nghĩa đen thay vì sử dụng chức năng đặc biệt của nó.
Gilles 'SO- đừng trở nên xấu xa'

@Gilles, bạn nói đúng .. đó là những gì tôi đã cố gắng truyền đạt tới Celada ....

4

Biểu tượng đó đại diện cho một ký tự NULL, với giá trị ASCII 000.

Bạn có thể thử:

:%s/\%x00/ /g

Thay thế:

Trên bàn phím có biểu tượng @ ở trên cùng của 2phím (cảm ơn Celada), bạn có thể thực hiện:

  • %s/<CTRL-2>/ /g (trên PC)

  • %s/<CTRL-SHIFT-2>/ /g (trên máy Mac)

trong đó <CTRL-2>có nghĩa là trước tiên nhấn xuống CTRLPC, giữ nó như nhấn xuống, nhấn 2, phát hành CTRL.

<CTRL-SHIFT-2>có nghĩa là đầu tiên nhấn xuốngcontrol Mac, giữ nó như ấn xuống, nhấn xuống shiftMac, giữ nó như nhấn xuống, nhấn 2, phát hành controlshift.

Cuối cùng, cả hai lệnh sẽ dẫn đến %s/^@/ /gtrên màn hình.^@có nghĩa là một ký tự đơn, không được ^theo sau @, vì vậy bạn không thể chỉ nhập ^@liên tiếp trong lệnh trên.

Lệnh này thay thế tất cả các ^@ký tự không gian.

( Nguồn )


Khi bạn nói "PC", ý bạn là Windows?
Sparhawk

1
CTRL-2 và CTRL-SHIFT-2 chỉ có ý nghĩa đối với bố trí bàn phím trong đó phím @nằm trên cùng của 2phím.
Celada

@Sparhawk: Không, ý tôi là một máy tính linux. :-)
erik

Tại sao lại là CTRL? Tôi chưa bao giờ thấy một hệ thống trong đó CTRL là khóa được sử dụng để thay đổi giữa ý nghĩa khác nhau của khóa. Đó là bình thường SHIFT.
terdon

Nó là lạ (có thể là một lỗi trong vim?), Nhưng nó hoạt động. Nó thường là ctrl + shift + 2 (trên bàn phím us). Hỏi nó như một câu hỏi riêng biệt hoặc hỏi các nhà phát triển vim. Dù sao câu trả lời của Celada là chung chung hơn cho các nhân vật điều khiển.
erik

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.