Score:0

จะต่อท้ายบรรทัดก่อนจับคู่รูปแบบแรกได้อย่างไร

ธง in

ฉันมีไฟล์ที่มีข้อมูลสุ่มเช่น:

หมายเลข 1 หมายเลข 2 หมายเลข 3
&จบ

ฉันต้องการเพิ่ม \ ต่อท้ายบรรทัดที่มีเลข 3 แต่ฉันไม่สามารถจับคู่รูปแบบในบรรทัดนั้นได้ เนื่องจากตัวเลขนั้นเปลี่ยนไปเรื่อยๆ ดังนั้นฉันจึงลองจับคู่ "&END" ใน sed แล้วต่อท้ายบรรทัดข้างหน้า แต่นั่นไม่ได้ผลสำหรับฉันเพราะมันสร้างบรรทัดใหม่ เช่น

หมายเลข 1 หมายเลข 2 หมายเลข 3

\

&จบ

ผลลัพธ์ที่ฉันต้องการคือ

หมายเลข1 หมายเลข2 หมายเลข3 \
&จบ

นอกจากนี้ ฉันต้องทำการเปลี่ยนแปลงนี้เมื่อ &END เกิดขึ้นครั้งแรกในไฟล์เท่านั้น มีวิธีการทำเช่นนี้โดยใช้ sed หรืออาจจะเป็น awk?

แก้ไข: ไฟล์อินพุตของฉันคือ test.restart ซึ่งมีลักษณะดังนี้:

&COORD

1.4089452021105357E+01 1.3165670625576730E+01 1.2727066323166799E+01 \
 ...

 ...

1.3549295360587577E+01 1.2120902691780184E+01 1.2741652733169291E+01

&จบ
...
...
&COORD

ฮ3475843 73457834 7346587435
...
...
&จบ

ฉันต้องทำการเปลี่ยนแปลงในกลุ่มข้อความก่อนที่จะ &END เกิดขึ้นครั้งแรกเท่านั้น

pLumo avatar
in flag
คุณต้องเพิ่มตัวอย่างในโลกแห่งความเป็นจริงเพื่อให้คำถามของคุณแก้ไขได้
Pauling0304 avatar
in flag
@pLumo ตัวอย่างโลกแห่งความเป็นจริงของอะไร วิธีแก้ปัญหาที่ฉันพยายามใช้ไม่ได้ผล?
pLumo avatar
in flag
ฉันหมายถึงข้อมูลอินพุต ("*ท้ายบรรทัดที่มีเลข 3 แต่ฉันไม่สามารถจับคู่รูปแบบในบรรทัดนั้นได้ เนื่องจากตัวเลขนั้นเปลี่ยนไปเรื่อยๆ*") "*number3*" ในโลกแห่งความเป็นจริงของคุณคืออะไร? หรือดีกว่า: คุณจะรู้ได้อย่างไรว่านี่คือบรรทัดที่คุณต้องการจับคู่
pLumo avatar
in flag
คำแนะนำอีกอย่าง: ใช้การจัดรูปแบบ `code` แทนการจัดรูปแบบ `quote` จะทำให้คำถามของคุณสามารถอ่านได้ดีขึ้น คุณสามารถแก้ไขคำถามของคุณ
pLumo avatar
in flag
okkkk... ตัวอย่างในโลกแห่งความเป็นจริงของคุณแตกต่างจากตัวอย่างแบบง่ายของคุณมาก \ ไม่ควรอยู่ที่ท้ายบรรทัดก่อน `&END`... จะอยู่ในบรรทัดถัดไปหลัง `&COORD` แทนหรือไม่
Pauling0304 avatar
in flag
@pLumo ไม่ นั่นคือ \ ที่ส่วนท้ายของบรรทัดหลังจาก &COORD มีอยู่แล้ว ตอนนี้ฉันต้องการวางไว้ที่ท้ายบรรทัดก่อน &END
pLumo avatar
in flag
อา ดี ถ้าอย่างนั้นคำตอบของฉันก็ใช้ได้
Score:1
ธง in

คุณสามารถใช้ได้ sed -z และรวมถึง \n ในรูปแบบของคุณ:

-z, --null-ข้อมูล
แยกบรรทัดด้วยอักขระ NUL

sed -Ez 's/(\n+&END)/ \1/' ไฟล์

เสด โดยค่าเริ่มต้นจะแทนที่เฉพาะเหตุการณ์แรกต่อบรรทัดเท่านั้น เนื่องจากคุณมีเพียงบรรทัดเดียวหากคุณใช้ตัวคั่น NUL คุณก็ไม่เป็นไร

-E บอก เสด เพื่อใช้ Extended Regex (ERE) แทน Basic Regex (BRE) คุณสามารถละเว้นแฟล็กได้ แต่คุณต้องออกจากวงเล็บปีกกา:

sed -z 's/\(\n+&END\)/ \1/' ไฟล์

เอาท์พุต:

&COORD

1.4089452021105357E+01 1.3165670625576730E+01 1.2727066323166799E+01 \
 ...

 ...

1.3549295360587577E+01 1.2120902691780184E+01 1.2741652733169291E+01 \

&จบ
...
...
&COORD

ฮ3475843 73457834 7346587435
...
...
&จบ

บันทึก, -z ใช้ได้ใน Ubuntu แต่ไม่สามารถใช้ได้ทั้งหมด เสด การใช้งานและไม่ใช่โซลูชันแบบพกพา

Pauling0304 avatar
in flag
คุณบอกฉันได้ไหมว่าแฟล็ก -E มีไว้เพื่ออะไร และฉันสามารถใช้ -i กับมันได้ไหม เพราะฉันต้องการแก้ไขให้เป็นไฟล์เดียวกัน
pLumo avatar
in flag
ใช่ คุณสามารถใช้ `-i` ได้หากคุณพอใจกับผลลัพธ์ เพิ่มคำอธิบายสำหรับ `-E`
Pauling0304 avatar
in flag
ฉันได้รับข้อผิดพลาด: sed: -e expression #1, char 19: การอ้างอิงไม่ถูกต้อง \1 บน RHS ของคำสั่ง `s'
pLumo avatar
in flag
แน่ใจนะว่าใช้คำสั่งเดียวกัน ?
Pauling0304 avatar
in flag
ใช่ ฉันยังคัดลอกและวาง
pLumo avatar
in flag
ทั้งสองทำงานได้ดีสำหรับฉัน Ubuntu รุ่นไหน ฉันได้รับข้อผิดพลาดนี้เมื่อใช้เวอร์ชันแรกโดยไม่มี `-E` ซึ่งเป็นสิ่งที่คาดหวังได้
Pauling0304 avatar
in flag
อูบุนตู 20.04.3 LTS
pLumo avatar
in flag
รุ่นเดียวกันนี่ ควรทำงานได้ดี ไม่สามารถบอกได้อีกต่อไป ฉันขอโทษ
Pauling0304 avatar
in flag
ฉันลองใช้ตัวเลือกอื่นโดยไม่มีแฟล็ก -E และนั่นไม่ได้ให้ข้อผิดพลาดใด ๆ แต่ก็ไม่ได้ทำงานเช่นกัน
pLumo avatar
in flag
ไอเดียดี @bac0n

โพสต์คำตอบ

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