ลบแบ็กสแลชออกจากไฟล์ข้อความ


10

ฉันมี

การป้อนข้อมูล:

 NISHA =\455  

เอาท์พุท:

 NISHA = 455

ฉันต้องการลบ\ออก ฉันพยายามใช้คำสั่งsed "s/[\]//g" Pแต่มันใช้งานไม่ได้และมีข้อผิดพลาด:

character found after backslash is not meaningful

3
ดูเหมือนว่าคุณจะมีการใช้งานที่ไม่ใช่ POSIX ของsed(หรืออาจเป็นคุณกำลังเรียกใช้คำสั่งนั้นจากเปลือกที่ไม่ใช่ POSIX?) คุณไม่ต้องการsedแม้ว่าtrจะพอ: tr -d '\\' < P.
Stéphane Chazelas

คำตอบ:


20

คุณสามารถแทนที่แบ็กสแลชด้วยช่องว่างตามที่คุณแสดงในผลลัพธ์ตัวอย่าง:

sed 's/\\/ /g'

หรือคุณสามารถลบออกได้ตามที่แสดงในรหัสของคุณ:

sed 's/\\//g'

ตัวละครพิเศษ

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

คำสั่งที่คุณพิมพ์ไปยังบรรทัดคำสั่งของเชลล์หรือสคริปต์จะถูกประมวลผลครั้งแรกโดยเชลล์ซึ่งตีความความหมายพิเศษของตัวละครและการหลบหนี ผลลัพธ์จะถูกส่งไปยังคำสั่งเพื่อดำเนินการ (เช่นsed) ซึ่งดำเนินการตีความตัวละครของตัวเอง เมื่อคุณกำลังสร้างคำสั่งขั้นตอนทางจิตเป็นวิธีที่ตรงกันข้าม: ก่อนเพิ่มการหลบหนีสำหรับ regex จากนั้นเพิ่มการหลบหนีสำหรับเปลือก

  1. ใน regex (ใส่คำสั่งเช่นsed, grepฯลฯ ) ทับขวาสามารถหนีทับขวาเช่นนี้\\และยังให้คุณสามารถใช้การแสดงออกชุด[\]เหมือนที่คุณนำมาใช้เพราะมีทับขวาสูญเสียความหมายพิเศษ

  2. ในเชลล์ (เช่นbash) คุณสามารถยกเว้นเครื่องหมายแบ็กสแลชด้วยแบ็กสแลช ดังนั้นแทนที่จะเขียน\ \\การใส่สตริงระหว่างเครื่องหมายอัญประกาศคู่"ทำให้แบ็กสแลชมีพฤติกรรมที่ซับซ้อนมากกว่า<1>แต่เครื่องหมายแบ็กสแลชคู่จะยังคงสร้างแบ็กสแลชเดี่ยว ล้อมรอบสตริงระหว่างคำพูดเดียวที่ทำให้ตัวละครทุกตัวได้รับการปฏิบัติอย่างแท้จริงยกเว้น''

หากคุณต้องการใช้เครื่องหมายคำพูดคู่คุณสามารถใช้หนึ่งในตัวเลือกต่อไปนี้:
sed "s/\\\\//g"- Escape \by \in the shell, และ escape ทุกอย่าง\ใน regex อีกครั้ง ในความเป็นจริงแล้วไม่จำเป็นต้องใส่เครื่องหมายอัญประกาศคู่นี้ในกรณีนี้เพราะอักขระพิเศษทุกตัวมีการหลีก
sed "s/[\\]//g"- หนีในเปลือกโดยเครื่องหมาย\และในการใช้งาน regex [ ]ไม่กำหนด
sed "s/[\]//g"- ใช่ตัวอย่างของคุณควรทำงานในสภาพแวดล้อมที่สอดคล้องกับ POSIX! ระหว่างเครื่องหมายอัญประกาศคู่\หมายถึงตัวเองเว้นแต่ว่าจะนำหน้าอักขระพิเศษในบริบทของเครื่องหมายคำพูดคู่: $`"\หรือขึ้นบรรทัดใหม่ ดูเหมือนว่าในกรณีของคุณเปลือกหรือsedไม่เป็นไปตามมาตรฐาน POSIX

ด้วยเครื่องหมายคำพูดเดี่ยวคุณยังสามารถใช้สตริงตามที่คุณใช้หรือวิธีที่สั้นกว่า:
sed 's/[\]//g'
sed 's/\\//g'



3

หากคุณไม่ต้องการวิธีแก้ไขปัญหาให้ลองคำสั่งต่อไปนี้

$ echo "NISHA =\455"| awk -F'\' '{print $1 $2}'
$ echo "NISHA =\455"| tr '\\' ' '
$ echo "NISHA =\455"| tr -d '\\'
$ echo "NISHA =\455"| cut -c 1-7,9-11


1
sed 's/\\//'

วางไว้\ก่อนหน้า\เช่นคุณกับตัวละครพิเศษมากที่สุด


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