Score:0

sed กับ ANSI color Escapes ล้มเหลว

ธง in

ฉันไม่รู้ว่าทำไมสิ่งนี้ถึงใช้งานไม่ได้:

echo -e "$(echo "นี่คือข้อความที่ไม่มีสี" | sed "s/{นี่คือข้อความที่ไม่มีสี}/{นี่คือ \033[0;34ข้อความที่ไม่มีสี\033[0m}/g")"

แต่ใช้งานได้ดี:

echo "$(echo "Hello World" | sed "s/Hello/Hi/g")"

คุณช่วยอธิบายให้ฉันฟังได้ไหม

Bodo avatar
pt flag
โปรด [แก้ไข] คำถามของคุณและอธิบายว่าคุณหมายความว่าอย่างไรกับ "สิ่งนี้ใช้ไม่ได้" คุณได้รับผลลัพธ์จริงอะไร คุณต้องการรับอะไร
Bruno Henrique Peixoto avatar
in flag
คำสั่งต่อไปนี้: start_command echo "นี่คือข้อความที่ไม่มีสี" | sed 's/นี่คือข้อความที่ไม่มีสี/นี่คือ \033\[0;34ข้อความสีเขียว\033\[0m/g' end_commend ยังคงใช้งานไม่ได้
Bruno Henrique Peixoto avatar
in flag
คุณช่วยวางผลลัพธ์สุดท้ายได้ไหม ฉันไม่เข้าใจโดยการแทนที่ ```[``` ด้วย ```\[``` เท่านั้น
Bruno Henrique Peixoto avatar
in flag
ปัญหาเดิมใช้สตริงที่ไม่มีสีและแทนที่ด้วยสตริงที่มีสี อย่างไรก็ตาม อย่างที่คุณเห็น รุ่นสีไม่มีเครื่องหมายแบ็กสแลช
Bruno Henrique Peixoto avatar
in flag
แก้ไขปัญหา!
Score:2
ธง hr

มีหลายประเด็น

ประการแรกเครื่องมือจัดฟัน {...} ในนิพจน์ sed ของคุณไม่ตรงกับสิ่งใดในอินพุต ใน sed Basic Regular Expression วงเล็บปีกกาจะเป็นตัวอักษร ในขณะที่ใน Extended Regular Expression วงเล็บจะล้อมรอบปริมาณของแบบฟอร์ม {n,m}. ไม่เคยใช้สำหรับการจัดกลุ่ม

ประการที่สอง ลำดับสีของคุณมีรูปแบบไม่ถูกต้อง - ช่องเปิดต้องเป็น \033[0;34ม ค่อนข้างมากกว่า \033[0;34

ประการที่สาม อักขระแบ็กสแลช \ เป็นพิเศษใน sed - โดยเฉพาะอย่างยิ่ง เครื่องหมายแบ็กสแลชตามด้วยหลักทศนิยมบน RHS ของการแทนที่เป็นการอ้างอิงย้อนกลับไปยังกลุ่มการดักจับ อย่างน้อยก็ใน GNU sed \0 หมายถึง LHS ที่จับได้ทั้งหมดเทียบเท่ากับโทเค็นการแทนที่พิเศษ & ตัวอย่างเช่น

$ เสียงสะท้อนฟู | sed 's/foo/\033bar/'
ฟู33บาร์

เพื่อส่งตัวอักษร \ สู่ภายนอก เสียงสะท้อน -e คุณต้องการ \\ ภายในสตริงการแทนที่ sed

ในที่สุด, \ เป็น อีกด้วย พิเศษสำหรับเชลล์ ดังนั้นภายในเครื่องหมายอัญประกาศคู่ "อ่อน" จึงจำเป็นต้องมีเครื่องหมายแบ็กสแลชเพิ่มเติม ดังนั้น:

echo -e "$(echo "นี่คือข้อความที่ไม่มีสี" | 
  sed "s/นี่คือข้อความที่ไม่มีสี/นี่คือ \033[0;34ข้อความสีเขียว\033[0m/")"

หรือ (แทนที่อัญประกาศคู่ด้านในด้วยอัญประกาศเดี่ยว 'strong'):

echo -e "$(echo "นี่คือข้อความที่ไม่มีสี" | 
  sed 's/นี่คือข้อความที่ไม่มีสี/นี่คือ \033[0;34ข้อความสีเขียว\033[0m/')"

โปรดทราบว่าคุณไม่จำเป็นต้องใช้ ตัวดัดแปลงเพื่อทำการแทนที่เพียงครั้งเดียวต่อบรรทัด

ดูสิ่งนี้ด้วย ฉันต้องหลีกเลี่ยงอักขระใดเมื่อใช้ sed ในสคริปต์ sh

Bruno Henrique Peixoto avatar
in flag
ฉันพยายามหาทางออก ลองดูคำตอบด้านล่าง
Score:0
ธง in

วิธีการแก้ปัญหาของฉัน:

#!/bin/bash

colored_text='นี่คือ \033[0;34mtext\033[0m'
uncoloured_text='นี่คือข้อความ'

printf %b\n "$(sed "s/$un colored_text/$colored_text/" <<< "$un colored_text")"

Bruno Henrique Peixoto avatar
in flag
ขอบคุณ bac0n! มันมีกลิ่นที่ดี

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา