ฉันจะแนะนำ BSD sed ให้ตีความลำดับ escape เช่น \ n และ \ t ได้อย่างไร


14

ฉันมีคำสั่งทดแทน sed ว่าผมต้องการที่จะเข้ากันได้กับ BSD sedเช่นเดียวกับ sedGNU นิพจน์ทั่วไปที่ขยายเพิ่มไม่ใช่ปัญหาเนื่องจากฉันไม่ต้องการใช้ในกรณีนี้ ปัญหาหลักของฉันคือความแตกต่างในวิธีที่ทั้งสองsedตีความลำดับหนีอักขระในสตริงการแทนที่ สตริงแทนที่ผมจะมีแท็บและการขึ้นบรรทัดใหม่และฉันต้องการให้พวกเขาสามารถมองเห็นได้ในสตริงคำสั่งเพื่อความสะดวกในการบำรุงรักษา แต่ BSD sedไม่ตีความลำดับหนีและ GNU ไม่sed อะไรคือวิธีที่เหมาะสมในการแนะนำsedให้ตีความลำดับการหลบหนีเหล่านี้ใน BSD ตัวอย่างสองต่อไปนี้เป็นตัวอย่างที่ชัดเจนของปัญหาของฉัน:

GNU sed

echo ABC | sed 's/B/\n\tB\n'

yeilds

A
    B
C

BSD sed

echo ABC | sed 's/B\n\tB\n'

อัตราผลตอบแทน

AntBnC

เห็นได้ชัด\nและ\tไม่ถูกตีความว่าเป็นลำดับหนีภัยของ BSDsed

ตอนนี้สำหรับคำถามของฉัน อ้างอิงจาก BSD sedmanpage:

ในการระบุอักขระขึ้นบรรทัดใหม่ในสตริงการแทนที่ให้นำหน้าด้วยแบ็กสแลช

นี้ไม่ได้บ่งบอกว่าผมจะต้องนำหน้าอักษรขึ้นบรรทัดใหม่โดยเครื่องหมาย? อะไรคือวิธีที่เหมาะสมในการแนะนำsedให้ตีความลำดับ escape เช่น\nในข้อความที่แทนที่


2
BSD sed ไม่ใช่ GNU sed และฉันไม่คิดว่ามันรองรับการหลบหนีเช่นนี้ในผลลัพธ์ คุณจะต้องแทรกตัวอักษรติดตั้ง GNU หรือเปลี่ยนไปใช้สิ่งที่รองรับการหลบหนีเช่น awk
jw013

@ jw013 ฉันชัดเจนกับความแตกต่างระหว่างสอง การติดตั้ง GNU sed ไม่ใช่ตัวเลือก ฉันหวังว่าจะหาจุดร่วมที่เพียงพอระหว่างสองสิ่งนี้เพื่อบรรลุสิ่งที่ฉันตามsedมา ในท้ายที่สุดมันอาจจะเหมาะสมที่จะใช้ awk ดังนั้นคุณคิดอย่างไรเกี่ยวกับการตีความของ manpage ของ BSD sed ที่ฉันยกมา?
ephsmith

2
ใช่คุณจะต้องใช้แท็บตัวอักษรและบรรทัดใหม่และด้วยการขึ้นบรรทัดใหม่คุณจำเป็นต้องนำหน้าด้วย backslash ซึ่งโดยพื้นฐานแล้วเป็นเพียงกลไกต่อเนื่องของบรรทัด
jw013

@ jw013 ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมของคุณ ณ จุดนี้เพื่อการบำรุงรักษาสาเกฉันจะรับคำแนะนำของคุณและนำกลับมาแก้ปัญหาของฉันใน awk
ephsmith

ทางเลือกที่ดี - awk เป็นแผนที่ดีกว่าคำตอบที่ได้รับการยอมรับในปัจจุบัน :)
jw013

คำตอบ:


6

หากคุณต้องการเขียนสคริปต์แบบพกพาคุณควรยึดติดกับคุณสมบัติในมาตรฐาน POSIX (หรือที่รู้จักในชื่อ Unix โสดหรือ Open Open Base Base) ฉบับที่ 7 aka POSIX-1.2008เป็นรุ่นล่าสุด แต่หลายระบบยังไม่ได้ใช้งาน ปัญหาที่ 6 หรือที่รู้จักว่า POSIX-1.2001นั้นมีขนาดใหญ่และจัดทำโดยหน่วยงานที่ทันสมัยทั้งหมด

ในsedความหมายของลำดับหนีเหมือน\tและ\nไม่ได้เป็นแบบพกพายกเว้นว่าในregex , \nย่อมาจากบรรทัดใหม่ ในข้อความแทนที่สำหรับsคำสั่ง\nไม่ใช่พกพาได้ แต่คุณสามารถใช้ลำดับแบ็กสแลช - ขึ้นบรรทัดใหม่เพื่อยืนขึ้นบรรทัดใหม่

วิธีแบบพกพาในการสร้างตัวละครที่แท็บ (หรือตัวละครอื่น ๆ ที่แสดงในฐานแปด) trอยู่กับ เก็บตัวละครไว้ในตัวแปรเชลล์และแทนที่ตัวแปรนี้ในตัวอย่างข้อมูล

tab=$(echo | tr '\n' '\t')
escape=$(echo | tr '\n' '\033')
embolden () {
  sed -e 's/^/'"$escape"'[1m/' -e 's/$/'"$escape"'[0m/'
}

โปรดทราบอีกครั้งว่าการขึ้นบรรทัดใหม่จำเป็นต้องแสดงต่างกันใน regexes และในsข้อความทดแทน

คุณอาจต้องการใช้awkแทน อนุญาตให้ใช้เครื่องหมายแบคสแลชรวมถึงฐานแปด\oooในทุกตัวอักษรสตริง


7

คุณสามารถใช้ทุบตีอ้างการตีความหนีก่อนที่จะผ่านสตริง$'...'sed

จากหน้าคนทุบตี:

   Words  of  the  form  $'string'  are  treated specially.  The word
   expands to string, with backslash-escaped characters  replaced  as
   specified  by the ANSI C standard.  Backslash escape sequences, if
   present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \nnn   the eight-bit character whose  value  is  the  octal
                 value nnn (one to three digits)
          \xHH   the eight-bit character whose value is the hexadeci-
                 mal value HH (one or two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the  dollar  sign  had
   not been present.

   A  double-quoted  string  preceded by a dollar sign ($) will cause
   the string to be translated according to the current  locale.   If
   the  current locale is C or POSIX, the dollar sign is ignored.  If
   the string is translated and replaced, the replacement is  double-
   quoted.

3

คำตอบนี้ได้รับการตอบสนองเมื่อซ้อนล้นมากเกินไป:

/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed

มันเป็นสิ่งที่ jw013 พูด

ในการแทรกประเภทแท็บตัวอักษร+ctrlVTab


ขอบคุณสำหรับการอ้างอิง ฉันเกลียดการค้นหา google ของฉันไม่ได้กลับลิงค์นั้น: D
ephsmith

1
ข้อเสนอแนะแท็บ ctrl-V ขึ้นกับเชลล์ตัวอย่างเช่นจะไม่ทำงานในปลา
anddam

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