Sed'in ekstra yeni satır karakterleri eklemesini nasıl durdurabilirim


17

Aşağıdaki 2 sedkomutu çalıştırıyorum . Birincisi yeni satır karakterlerini istediğim yere ekler, ikincisi yeni satır karakterlerini de istediğim yere ekler, AMA ayrıca dosyanın sonuna daha önce olmayan bir satır ekler.

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 -cTüm 3 dosyada kullanmak aşağıdaki çıktıyı verir.

ifade_tmp_1.xml ( \ndosya sonunda yok )

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

ifade_tmp_2.xml ( \ndosya sonunda yok )

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

expression_tmp_3.xml ( \ndosya sonunda - nereden geldi?)

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 kullanıyorum

Temel olarak, ya ekstra eklemeyi bırakmasını \nya da kaldırmanın bir yolunu bulmak istiyorum .


Sadece bir soru: Yedek modelinizde neden de kullanabileceğiniz gerçek bir satırsonu kullanıyorsunuz s|...|&\n|?
Joseph R.

1
@JosephR. \nsağ tarafta taşınabilir değildir.
Stéphane Chazelas

@StephaneChazelas Bu çok garip. CR mi yoksa CRLF mi?
Joseph R.

2
Yeni satır karakteri ile bitmeyen bir dosya bir metin dosyası değildir, bu nedenle üzerlerinde metin yardımcı programlarıyla davranış belirtilmez . perlİkili verilerle başa çıkabilen başka bir araç kullanın .
Stéphane Chazelas

4
@JosephR. Hayır, \<LF>LF karakteri eklemenin geleneksel ve POSIX yoludur. \ntipik olarak GNU'dan başka bir şeydeki bir nkarakterin yerine geçer sed.
Stéphane Chazelas

Yanıtlar:


12

AIX'in sedeksik yeni satır karakterlerini eklediği için kendinizi şanslı saymalısınız.

Bir satırsonu karakteriyle bitmeyen boş olmayan bir dosya bir metin dosyası değildir (en azından bir metin dosyasının POSIX tanımına göre), bir metin dosyasının satır içermesi ve satırların ( uzun) bir satırsonu karakteri tarafından sonlandırılan karakter dizisi, bu nedenle onun gibi metin yardımcı programlarının davranışı sedbelirtilmez ve uygulamada uygulamadan uygulamaya değişir.

Bazı seduygulamalar son satırdan sonra bu sahte karakteri reddederdi.

AFAIK, xmldosyalar metin dosyalarıdır, bu yüzden sedsizin için düzeltilmiş demektir .

Bu dosyanın yeni satır karakteri ile bitmemesine ihtiyacınız varsa, perlmetin olmayan verilerle başa çıkabilen diğer araçları kullanabilirsiniz .

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

1
Çıktınızı başka bir standart Unix yardımcı programına bağlamayı düşünüyorsanız , sondaki yeni satır yararlı olur sed. Dürüst olmak gerekirse, bunu yıllarcased yaptığımı fark etmedim , çünkü Bourne kabuğu komuta ikameleri , eğer varsa, son satırsonunu gizlice kırpıyor. Ama vardır kesinlikle istemiyorum kez; örneğin , X panosu metnini ile değiştirmek . FYI, GNU sed, varsa, bu SE yanıtında açıklandığı gibi , seçenekle birlikte kullanılırsa sonlandırıcı bir yeni satır eklemez . $(sed 's/bas/replac/' <<<'basement')sedp-n
thedudeabides

0

Son satırsonunu kullanarak bir dosyadan kaldırmanın bir yolu dd:

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

Bir dosyanın yeni satırla bitip bitmediğini test etmek için şunları kullanabilirsiniz:

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

Ve dosya boyutunu bayt olarak kullanmak için:

wc -c < /path/to/file

0

Bu AIX kılavuzuna göre IBM tailher -rşeyden önce oldukça havalı görünüyor. Dosyanız 20 KB'ın altında olduğu sürece aşağıdakiler çalışmalıdır:

tail -r <file | dd bs=1 skip=1 | tail -r >file.new
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.