sedが改行を追加するのをやめる方法

sedが改行を追加するのをやめる方法

次の2つのコマンドを実行していますsed。 1つ目は私が欲しいところに改行を追加し、2番目は私が望むところに改行を追加しますが、以前に改行がなかったファイルの末尾に改行を追加します。

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つのファイルすべてに使用すると、次のような出力が生成されます。

comments_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

comments_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

comments_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を使用しています。

基本的に extra の追加を中断\nまたは削除する方法を探したいと思います。

答え1

幸運だと思わなければなりません。 AIXは、sed欠落している改行文字を追加します。

改行で終わらない空でないファイルは(少なくともテキストファイルのPOSIX定義による)テキストファイルではありません。改行で終わる文字なので、テキストは実用的です。プログラムの動作(例:sed上記)は指定されておらず、実際には実装によって異なります。

一部のsed実装では、最後の行の後の偽の文字を無視します。

AFAIK、xmlファイルはテキストファイルである必要があるため、sed変更されたばかりです。

ファイルが改行で終わらないようにする必要がある場合は、perlテキスト以外のデータを処理できる他のツールを使用できます。

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

答え2

以下を使用してファイルから最後の改行文字を削除する方法は次のとおりです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

答え3

これによるとAIX マニュアルIBMはtailそうです-r。素敵に見えます。ファイルが 20 KB 未満の場合は、次の動作します。

tail -r <file | dd bs=1 skip=1 | tail -r >file.new

関連情報