ค้นหาและแทนที่อักขระควบคุม (^ @, ^ M, ^ I …) ใน vi


14

ฉันคัดลอกบรรทัดนี้จาก/proc/some_proc_id/cmdlineในเครื่อง Ubuntu ของฉัน

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

อย่างใดอักขระช่องว่างจะถูกแทนด้วย^@ใน vi ฉันพยายามแทนที่พวกเขาด้วยอักขระช่องว่างโดยใช้คำสั่ง

:%s#^@# #g

แต่มันบอกว่าpattern not found ^@.

หนึ่งจะสามารถแทนที่อักขระพิเศษโดยเฉพาะอย่างยิ่งที่เริ่มต้นด้วยสัญลักษณ์กะรัตได้อย่างไร


ประเภทอาคารที่คุณใช้อยู่คืออะไร?
Ed Heal

ในบางครั้งTERMและหลายครั้งก็เป็นscreen

โปรแกรมเทอร์มินัลที่คุณใช้คืออะไรและTERMตั้งค่าตัวแปรสภาพแวดล้อมอย่างถูกต้อง?
Ed Heal

คำตอบ:


15

อย่างใดอักขระช่องว่างจะถูกแทนด้วย^@ใน vi

มันไม่ได้viทำอย่างนั้น แม้ว่าคุณจะพิมพ์บรรทัดคำสั่งในเชลล์ที่มีช่องว่างระหว่างอาร์กิวเมนต์บรรทัดคำสั่งเป็นจริงโดยสิ้นเชิงลำดับของสตริงภายในไม่ใช่สตริงที่คั่นด้วยช่องว่างยาว เชลล์แยกบรรทัดคำสั่งออกเป็นสตริงอาร์กิวเมนต์แต่ละรายการก่อนที่คำสั่งจะเปิดตัว

ใน C สตริงจะสิ้นสุดกับตัวละคร NUL ^@และผู้ที่จะแสดงเป็น

หนึ่งจะสามารถแทนที่อักขระพิเศษโดยเฉพาะอย่างยิ่งที่เริ่มต้นด้วยสัญลักษณ์กะรัตได้อย่างไร

เพื่อที่จะพิมพ์ตัวอักษรเหล่านั้นคุณจะต้องนำหน้าด้วยControl- vสำหรับตัวอักษรตัวต่อไป

ยกตัวอย่างเช่นในกรณีนี้: Control- vตามด้วย-Control@

อักขระพิเศษที่แนะนำตัวอักษรถัดไปตามตัวอักษรเป็นปกติControl- vแต่มันสามารถกำหนดค่าได้จริง พิมพ์stty -aเพื่อค้นหาสิ่งที่ตั้งไว้ ค้นหาlnextในผลลัพธ์


โพสต์เป็นข้อมูล .. แต่วิธีการแก้ปัญหาที่แท้จริงสำหรับคำถามของฉันคือการหลบหนีสัญลักษณ์กะรัต :%s#^@##g- ตั้งแต่ฉันคัดลอกวางจาก terminal, vi ได้วางพวกเขาเป็นตัวละครเดิม ...

1
@MadhavanKumar คุณไม่หนีสัญลักษณ์ลูกศรเพราะมีคือไม่มีสัญลักษณ์ลูกศร มันเป็นตัวควบคุมที่แท้จริง ^letterเป็นเพียงสัญกรณ์ภาพสำหรับสิ่งนั้นไม่มีคาเร็ตที่แท้จริงเข้ามาเกี่ยวข้อง และใช่คุณต้องหลบหนีจากตัวควบคุม Ctrl-V เป็นวิธีที่คุณทำจากคีย์บอร์ด ที่ใช้งานได้ทุกที่ FYI คำตอบอื่น ๆ มีทางเลือกเฉพาะสำหรับviบรรทัดคำสั่งของเพื่อหลีกเลี่ยงการพิมพ์อักขระควบคุมเลย
Celada

@MadhavanKumar หากเทอร์มินัลของคุณแสดงอักขระ NUL เป็นสตริงอักขระสองตัว^@และคุณคัดลอกวางไว้ให้ใช้\^@เพื่อแสดงสตริงอักขระสองตัวนั้นใน vi ซอฟต์แวร์จำนวนมากใช้เครื่องหมายแบ็กสแลชเพื่อแปลความหมาย "ตีความอักขระตัวถัดไปแทนที่จะใช้ฟังก์ชั่นพิเศษ"
Gilles 'หยุดชั่วร้าย'

@Gilles คุณพูดถูก .. นั่นคือสิ่งที่ฉันพยายามสื่อถึง Celada ....

4

สัญลักษณ์นั้นแสดงถึงอักขระ NULL โดยมีค่า ASCII 000

คุณสามารถลอง:

:%s/\%x00/ /g

ทางเลือก:

บนแป้นพิมพ์ที่มีสัญลักษณ์ @ อยู่ด้านบนของ2กุญแจ (ขอบคุณ Celada) คุณสามารถทำได้:

  • %s/<CTRL-2>/ /g (บนพีซี)

  • %s/<CTRL-SHIFT-2>/ /g (บน Mac)

ที่<CTRL-2>กดหมายแรกลงCTRLบน PC, ทำให้มันกดลงตีปล่อย2CTRL

และ<CTRL-SHIFT-2>วิธีการกดครั้งแรกลงcontrolบน Mac ทำให้มันกดลงกดลงshiftบน Mac ทำให้มันกดลงตี2ปล่อยและcontrolshift

ในที่สุดทั้งสองคำสั่งควรส่งผลให้%s/^@/ /gบนหน้าจอ ^@หมายถึงอักขระตัวเดียวที่ไม่ได้^ตามมา@ดังนั้นคุณจึงไม่สามารถพิมพ์^และ@เรียงแถวในคำสั่งด้านบนได้

คำสั่งนี้แทนที่^@ด้วยอักขระเว้นวรรคทั้งหมด

( ที่มา )


เมื่อคุณพูดว่า "PC" คุณหมายถึง Windows หรือไม่
Sparhawk

1
CTRL-2 และ CTRL-SHIFT-2 จะใช้งานได้เฉพาะกับรูปแบบแป้นพิมพ์ที่@อยู่ด้านบนของ2ปุ่ม
Celada

@Sparhawk: ไม่ฉันหมายถึงพีซีลินุกซ์ :-)
erik

ทำไมต้อง CTRL ฉันไม่เคยเห็นระบบที่ CTRL เป็นกุญแจสำคัญที่ใช้เพื่อเปลี่ยนความหมายที่แตกต่างของคีย์ โดยปกติแล้ว SHIFT
terdon

มันแปลก (อาจเป็นข้อผิดพลาดในกลุ่ม?) แต่มันใช้งานได้ โดยทั่วไปควรเป็น ctrl + shift + 2 (บนแป้นพิมพ์ของเรา) ถามเป็นคำถามแยกต่างหากหรือถามนักพัฒนาที่เป็นกลุ่ม อย่างไรก็ตามคำตอบของ Celada นั้นเป็นเรื่องทั่วไปสำหรับตัวควบคุม
erik

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.