ฉันมี
การป้อนข้อมูล:
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
.