42

存在しない場合にのみ、ファイルの最後に改行を追加したい。これは、ファイルの末尾に複数の改行が入るのを防ぐためです。

利用したいと思っていますsed。現在のコードで発生している問題は次のとおりです。

sed -i -e '/^$/d;$G' /inputfile

echo file1
name1
name2

echo file2
name3
name4
(newline)

ファイルに対してコードを実行するとき。

echo file1
name1
name2
(newline)

echo file2
name3
name4

改行がない場合は改行を追加しますが、存在する場合は削除します...これは私を困惑させます。

4

8 に答える 8

13

最後に改行を追加するだけでファイル全体を処理するのではなく、最後の文字を確認し、それが改行でない場合は追加します。シェルは通常、文字列の末尾から改行を削除するため、改行のテストは少し興味深いので、保護するために「x」を追加します。

if [ "$(tail -c1 "$inputfile"; echo x)" != $'\nx' ]; then
    echo "" >>"$inputfile"
fi

これにより、空のファイルに改行が追加されることに注意してください。これは、必要なものではない可能性があります。空のファイルをそのままにしておく場合は、別のテストを追加します。

if [ -s "$inputfile" ] && [ "$(tail -c1 "$inputfile"; echo x)" != $'\nx' ]; then
    echo "" >>"$inputfile"
fi
于 2012-04-10T02:37:43.053 に答える
8

改行がない場合は削除されるため、次のように簡単に使用できます。

echo "" >> file;  sed -ie '/^$/d;$G' file; sed -ie '/^$/d;$G' file

改行を追加し、すべてを削除してから改行を追加します。エレガントな方法ではありませんが、確かに機能します:)

于 2012-04-10T02:18:12.773 に答える
2

awk の使用:

awk '/^$/{f=1}END{ if (!f) {print "\r"}}1' inputfile

空行を一致^$させて(あなたがしたように)、フラグを設定します。フラグが最後に設定されていない場合は、改行文字を配置します。

注: それ\rは OS X にあります。\nその他に使用します。

于 2012-04-10T02:54:00.490 に答える
1

viまたはを使用してみてくださいex:

ex -scwq foo.txt

または複数のファイルの場合:

vi -es +"bufdo wq" *.txt
ex -s +"bufdo wq" *.txt

ファイルが見つからない場合、ファイル保存時に EOF に EOL を自動的に追加します。

特定のファイルに再帰的に適用するには、 (enable by )などの新しいグロビング オプション( ) を使用します。****/*.txtshopt -s globstar

于 2015-05-16T20:21:12.100 に答える
0

フラグdos2unixで(または対応するもの)を使用して、このタスクを解決しました。--newline利点は、これらのツールが独自にバイナリ ファイルを検出することです。私はソリューションが好きですが、tail -c1事前にバイナリファイルをフィルタリングするのは本当に遅かったです。

dos2unix --newline my_file.txt

最終的に、プロジェクト ディレクトリを検索し、ファイル ( , )を除くすべてのファイルをLF( ) に変換し、フラグを使用して 1 回の呼び出しで改行を正しく取得するスクリプトを作成しました。dos2unix*.cmdCRLFunix2dos

于 2014-10-22T13:11:40.910 に答える