ฉันมี
การป้อนข้อมูล:
NISHA =\455
เอาท์พุท:
NISHA = 455
ฉันต้องการลบ\ออก ฉันพยายามใช้คำสั่งsed "s/[\]//g" Pแต่มันใช้งานไม่ได้และมีข้อผิดพลาด:
character found after backslash is not meaningful
ฉันมี
การป้อนข้อมูล:
NISHA =\455
เอาท์พุท:
NISHA = 455
ฉันต้องการลบ\ออก ฉันพยายามใช้คำสั่งsed "s/[\]//g" Pแต่มันใช้งานไม่ได้และมีข้อผิดพลาด:
character found after backslash is not meaningful
คำตอบ:
คุณสามารถแทนที่แบ็กสแลชด้วยช่องว่างตามที่คุณแสดงในผลลัพธ์ตัวอย่าง:
sed 's/\\/ /g'
หรือคุณสามารถลบออกได้ตามที่แสดงในรหัสของคุณ:
sed 's/\\//g'
มีปัญหาที่เป็นไปได้เกี่ยวกับการหลบหลีกของแบ็กสแลชเพื่อยกเลิกความหมายพิเศษ แบ็กสแลชเป็นอักขระพิเศษที่ใช้สำหรับการหลบหนีทั้งในเชลล์และในนิพจน์ทั่วไป
คำสั่งที่คุณพิมพ์ไปยังบรรทัดคำสั่งของเชลล์หรือสคริปต์จะถูกประมวลผลครั้งแรกโดยเชลล์ซึ่งตีความความหมายพิเศษของตัวละครและการหลบหนี ผลลัพธ์จะถูกส่งไปยังคำสั่งเพื่อดำเนินการ (เช่นsed) ซึ่งดำเนินการตีความตัวละครของตัวเอง เมื่อคุณกำลังสร้างคำสั่งขั้นตอนทางจิตเป็นวิธีที่ตรงกันข้าม: ก่อนเพิ่มการหลบหนีสำหรับ regex จากนั้นเพิ่มการหลบหนีสำหรับเปลือก
ใน regex (ใส่คำสั่งเช่นsed, grepฯลฯ ) ทับขวาสามารถหนีทับขวาเช่นนี้\\และยังให้คุณสามารถใช้การแสดงออกชุด[\]เหมือนที่คุณนำมาใช้เพราะมีทับขวาสูญเสียความหมายพิเศษ
ในเชลล์ (เช่น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'
คุณต้องหลบหนีแบ็กสแลช ลองสิ่งนี้:
sed 's/\\//g'
หากคุณไม่ต้องการวิธีแก้ไขปัญหาให้ลองคำสั่งต่อไปนี้
$ 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
เมื่อวานฉันจะทำสิ่งนี้
$ echo 'NISHA =\455' | awk '{gsub(/\\/," ")}1'
NISHA = 455
sed 's/\\//'
วางไว้\ก่อนหน้า\เช่นคุณกับตัวละครพิเศษมากที่สุด
gตั้งค่าสถานะโดยไม่ทราบสาเหตุ สิ่งนี้จะเปลี่ยนพฤติกรรมของคำสั่ง แต่การเปลี่ยนแปลงดังกล่าวไม่ได้ถูกถาม มิฉะนั้นคำตอบของคุณจะไม่นำสิ่งใหม่มาเปรียบเทียบกับคำตอบก่อนหน้านี้
sed(หรืออาจเป็นคุณกำลังเรียกใช้คำสั่งนั้นจากเปลือกที่ไม่ใช่ POSIX?) คุณไม่ต้องการsedแม้ว่าtrจะพอ:tr -d '\\' < P.