ฉันจะหยุดไม่ให้เพิ่มอักขระบรรทัดใหม่ได้อย่างไร


17

ฉันรันsedคำสั่ง2 ต่อไปนี้ ตัวแรกเพิ่มตัวอักขระขึ้นบรรทัดใหม่ที่ฉันต้องการตัวที่สองเพิ่มตัวอักขระขึ้นบรรทัดใหม่ตามที่ฉันต้องการ แต่ BUT ยังเพิ่มตัวอักขระพิเศษที่ท้ายไฟล์ซึ่งไม่เคยมีมาก่อน

sed -e 's|\<LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_1.xml > ${XMLDIR}/statement_tmp_2.xml

sed -e 's|\</LIST_G_STATEMENT>|&\
|g' ${XMLDIR}/statement_tmp_2.xml > ${XMLDIR}/statement_tmp_3.xml

การใช้od -cไฟล์ทั้ง 3 ตัวให้ผลลัพธ์ต่อไปนี้

statement_tmp_1.xml (ไม่ใช่\nไฟล์ท้ายไฟล์)

1314700    T   A   T   E   M   E   N   T   >   <   /   L   I   S   T   _
1314720    G   _   S   T   A   T   E   M   E   N   T   >   <   /   G   _
1314740    S   E   T   U   P   >   <   /   L   I   S   T   _   G   _   S
1314760    E   T   U   P   >   <   /   A   R   X   S   G   P   O   >
1314777

statement_tmp_2.xml (ไม่มี\nที่ส่วนท้ายของไฟล์)

1314700    S   T   A   T   E   M   E   N   T   >   <   /   L   I   S   T
1314720    _   G   _   S   T   A   T   E   M   E   N   T   >   <   /   G
1314740    _   S   E   T   U   P   >   <   /   L   I   S   T   _   G   _
1314760    S   E   T   U   P   >   <   /   A   R   X   S   G   P   O   >
1315000

statement_tmp_3.xml ( \nตอนท้ายไฟล์ - มันมาจากไหน?)

1314700    S   T   A   T   E   M   E   N   T   >   <   /   L   I   S   T
1314720    _   G   _   S   T   A   T   E   M   E   N   T   >  \n   <   /
1314740    G   _   S   E   T   U   P   >   <   /   L   I   S   T   _   G
1314760    _   S   E   T   U   P   >   <   /   A   R   X   S   G   P   O
1315000    >  \n
1315002

ฉันกำลังรัน AIX 5.3

โดยพื้นฐานแล้วฉันต้องการให้มันหยุดเพิ่ม\nหรือหาวิธีลบมัน


แค่คำถาม: ทำไมคุณถึงใช้ตัวอักษรขึ้นบรรทัดใหม่ในรูปแบบการทดแทนของคุณเมื่อคุณสามารถใช้ได้s|...|&\n|เช่นกัน?
โจเซฟอาร์

1
@JosephR \nในด้านขวาไม่ได้พกพา
Stéphane Chazelas

@StephaneChazelas นั่นแปลก มันเป็นสิ่งที่ CR vs CRLF?
โจเซฟอาร์

2
ไฟล์ที่ไม่ได้ลงท้ายด้วยอักขระขึ้นบรรทัดใหม่ไม่ใช่ไฟล์ข้อความดังนั้นการทำงานกับยูทิลิตี้ข้อความที่ไม่ได้ระบุไว้ ใช้perlหรือเครื่องมืออื่น ๆ ที่สามารถจัดการกับข้อมูลไบนารี
Stéphane Chazelas

4
@JosephR ไม่\<LF>เป็นวิธีดั้งเดิมและ POSIX ในการเพิ่มอักขระ LF \nโดยทั่วไปจะแทนnตัวละครในอะไร แต่ sedGNU
Stéphane Chazelas

คำตอบ:


10

คุณควรถือว่าตัวเองโชคดีที่ AIX sedเพิ่มอักขระบรรทัดใหม่ที่หายไป

ไฟล์ที่ไม่ว่างที่ไม่ได้ลงท้ายด้วยอักขระขึ้นบรรทัดใหม่ไม่ใช่ไฟล์ข้อความ (อย่างน้อยตามนิยาม POSIX ของไฟล์ข้อความ) เนื่องจากไฟล์ข้อความมีความหมายที่จะมีบรรทัดและบรรทัดคือ (ไม่ใช่ - เกินไป - ยาว) ลำดับของอักขระที่ถูกยกเลิกโดยอักขระขึ้นบรรทัดใหม่ดังนั้นพฤติกรรมของยูทิลิตี้ข้อความเช่น sedกับมันจะไม่ระบุและในทางปฏิบัติจะแตกต่างกันไปจากการนำไปใช้งาน

บาง sedการใช้งานอาจทำให้ตัวละครปลอมหลังจากบรรทัดสุดท้าย

AFAIK xmlหมายถึงไฟล์ที่เป็นไฟล์ข้อความดังนั้นจึงมีความหมายว่าsedแก้ไขให้คุณ

หากคุณต้องการไฟล์นั้นไม่ต้องลงท้ายด้วยอักขระขึ้นบรรทัดใหม่คุณสามารถใช้perlหรือเครื่องมืออื่น ๆ ที่สามารถรับมือกับข้อมูลที่ไม่ใช่ข้อความได้

perl -pe 's|<LIST_G_STATEMENT>|$&\n|g'

1
การขึ้นบรรทัดใหม่จะมีประโยชน์หากคุณคาดว่าจะsedส่งออกไปยังยูทิลิตี้ Unix มาตรฐานอื่น ๆ สุจริตฉันไม่ได้สังเกตเห็นsedว่าสิ่งนี้ทำมาหลายปีตั้งแต่การแทนที่คำสั่งเชลล์เป้าหมายเช่นการ$(sed 's/bas/replac/' <<<'basement')ตัดบรรทัดใหม่ขั้นสุดท้ายหากมีอย่างใดอย่างหนึ่ง แต่มีอยู่ครั้งเมื่อคุณมั่นเหมาะไม่ต้องการมัน เช่นจัดการ X sedข้อความคลิปบอร์ดด้วย FYI, GNU sed ถ้ามีจะไม่เพิ่มบรรทัดใหม่หากคุณใช้pกับ-nตัวเลือกดังที่อธิบายไว้ในคำตอบ SEนี้
TheDudeAbides

0

นี่คือวิธีในการลบบรรทัดใหม่สุดท้ายออกจากไฟล์โดยใช้dd:

printf "" | dd  of='/path/to/file' seek=<filesize_in_bytes - 1> bs=1 count=1

ในการทดสอบว่าไฟล์ลงท้ายด้วยบรรทัดใหม่ที่คุณสามารถใช้:

tail -c 1 /path/to/file | tr -dc '\n' | wc -c

และเพื่อให้ได้ขนาดไฟล์เป็นไบต์ให้ใช้:

wc -c < /path/to/file

0

ตามคู่มือการใช้งานนี้ของไอบีเอ็มไอบีเอ็มtailไม่-rชัดเจน - ซึ่งดูดีสวย ตราบใดที่ไฟล์ของคุณมีขนาดต่ำกว่า 20KB ต่อไปนี้ควรใช้งานได้:

tail -r <file | dd bs=1 skip=1 | tail -r >file.new
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.