sedが余分な改行文字を追加しないようにする方法


17

次の2つのsedコマンドを実行しています。最初の行は、必要な場所に改行文字を追加し、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 -c3つのファイルすべてで使用すると、次の出力が得られます。

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|ですか?
ジョセフR.

1
@JosephR。\n右側には携帯型ではありません。
ステファンシャゼル

@StephaneChazelasそれは奇妙だ。CR vs CRLFのことですか?
ジョセフR.

2
改行文字で終わらないファイルはテキストファイルではないため、テキストユーティリティでの動作は不特定です。使用perlまたはバイナリデータを扱うことができる他のツール。
ステファンシャゼル

4
@JosephR。いいえ、\<LF>LF文字を追加する従来のPOSIXの方法です。\n通常n、GNU以外の文字を文字に置き換えますsed
ステファンシャゼル

回答:


10

AIX sedが行方不明の改行文字を追加したことを幸運に思う必要があります。

改行文字で終わらない空ではないファイルは、テキストファイルではありません(少なくともテキストファイルのPOSIX定義によると)。テキストファイルには行が含まれ、行は(長い)改行文字で終了する文字シーケンス。そのため、そのようなテキストユーティリティの動作sedは指定されておらず、実際には実装ごとに異なります。

いくつかのsed実装では、最後の行の後にこれらの偽の文字を無視します。

知ってのとおり、xmlファイルはテキストファイルであるため、sed修正するだけです。

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

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

1
出力を他の標準Unixユーティリティにパイプする場合、改行を終了する便利sedです。正直なところ、Bourneシェルコマンドの置換が最終的な改行がある場合、それを最終的にトリムするなどのsed理由で、私は何もこれを行ったことに気付きませんでした$(sed 's/bas/replac/' <<<'basement')。しかし、そこにある、あなたは間違いなくそれを望んでいない時間は、例えば、でXクリップボードのテキストを操作しsedます。このSE回答で説明されているように、GNU sedが利用可能な場合、FYI、オプションで使用pする場合、終了改行を追加しません。-n
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

このAIXマニュアルによると、IBM tail-r逆方向に対応しています。ファイルが20 KB未満である限り、次のように機能します。

tail -r <file | dd bs=1 skip=1 | tail -r >file.new
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.