Bagaimana cara saya menghentikan penambahan karakter baris baru


17

Saya menjalankan 2 sedperintah berikut . Yang pertama menambahkan karakter baris baru di mana saya inginkan, yang kedua juga menambahkan karakter baris baru di mana saya ingin mereka, TAPI juga menambahkan satu lagi di akhir file di mana tidak ada sebelumnya.

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

Menggunakan od -cpada ketiga file memberikan output berikut.

statement_tmp_1.xml (tidak ada \ndi akhir file)

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 (tidak ada \ndi akhir file)

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 ( \ndi akhir file - dari mana asalnya?)

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

Saya menjalankan AIX 5.3

Pada dasarnya, saya ingin menghentikan penambahan \n, atau menemukan cara menghapusnya.


Hanya sebuah pertanyaan: mengapa Anda menggunakan baris baru literal dalam pola substitusi Anda saat Anda bisa menggunakannya s|...|&\n|juga?
Joseph R.

1
@ JosephephR. \ndi sisi kanan tidak portabel.
Stéphane Chazelas

@StephaneChazelas Aneh. Apakah ini CR vs CRLF?
Joseph R.

2
File yang tidak diakhiri dengan karakter baris baru bukanlah file teks, jadi perilaku dengan utilitas teks pada mereka tidak ditentukan . Gunakan perlatau alat lain yang dapat menangani data biner.
Stéphane Chazelas

4
@ JosephephR. Tidak, \<LF>adalah cara tradisional dan POSIX untuk menambahkan karakter LF. \nbiasanya akan menggantikan nkarakter dalam apa pun selain GNU sed.
Stéphane Chazelas

Jawaban:


10

Anda harus menganggap diri Anda beruntung karena AIX sedmenambahkan karakter baris baru yang hilang itu.

File tidak kosong yang tidak diakhiri dengan karakter baris baru bukan file teks (setidaknya sesuai dengan definisi POSIX dari file teks) karena file teks dimaksudkan untuk memuat baris dan baris adalah (tidak terlalu juga long) urutan karakter yang diakhiri oleh karakter baris baru, sehingga perilaku utilitas teks seperti seddi atasnya tidak ditentukan dan dalam praktiknya bervariasi dari implementasi ke implementasi.

Beberapa sedimplementasi akan menghilangkan karakter palsu itu setelah baris terakhir.

AFAIK, xmlfile dimaksudkan untuk menjadi file teks, jadi itu berarti sedhanya memperbaikinya untuk Anda.

Jika Anda benar-benar membutuhkan file itu untuk tidak mengakhiri karakter baris baru, maka Anda bisa menggunakannya perl atau alat lain yang dapat mengatasi data non-teks.

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

1
Terminating baris baru adalah membantu, jika Anda berharap untuk pipa Anda sedoutput ke utilitas Unix standar lainnya. Jujur, saya tidak melihat sedmelakukan ini selama bertahun - tahun , karena penggantian perintah shell Bourne seperti $(sed 's/bas/replac/' <<<'basement')diam - diam memotong baris terakhir, jika ada. Tapi ada yang kali ketika Anda pasti tidak ingin itu; misalnya , memanipulasi teks clipboard X dengan sed. FYI, GNU sed, jika tersedia, tidak menambahkan baris baru yang berhenti jika Anda menggunakannya pdengan -nopsi, seperti yang dijelaskan dalam jawaban SE ini .
TheDudeAbides

0

Berikut adalah cara untuk menghapus baris baru terakhir dari file menggunakan dd:

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

Untuk menguji apakah file berakhir dengan baris baru yang dapat Anda gunakan:

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

Dan untuk mendapatkan ukuran file dalam byte, gunakan:

wc -c < /path/to/file

0

Menurut manual AIX ini IBM tailtidak -rkalah - yang terlihat sangat keren. Selama file Anda di bawah 20KB berikut ini akan berfungsi:

tail -r <file | dd bs=1 skip=1 | tail -r >file.new
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.