ファイルの最後で改行文字を削除するにはどうすればよいですか?


34

改行文字について明確にしましょう:

$ echo Hello > file1 ; cat file1
Hello
$ echo -n  Hello > file2 ; cat file2
Hello$ 

ここfile1では、末尾に改行文字があり、そうでfile2はないことがわかります。

今私が持っていると仮定しますfile

$ cat file
Hello
Welcome to
Unix
$

そしてand Linux、ファイルの最後に追加したいのでecho " and Linux" >> file、改行に追加されます。しかし、最後の行はUnix and Linux

したがって、回避するには、ファイルの最後にある改行文字を削除します。したがって、ファイルの最後にある改行文字を削除するにはどうすればよいですか?


6
削除しないで、テキストエディタを使用してください。sed '$s/$/ and linux/'
123

回答:


28

最後の行にテキストを追加するだけであれば、sedを使用すると非常に簡単です。$範囲内の行でのみ、追加するテキストで(行末のパターンマッチング)を置き換えます$(最後の行を意味する)。

sed '$ s/$/ and Linux/' <file >file.new &&
mv file.new file

Linuxではこれを短縮できます

sed -i '$ s/$/ and Linux/' file

ファイルの最後のバイトを削除したい場合、Linux(より正確にはGNU coreutils)は truncateコマンドを。これにより、非常に簡単になります。

truncate -s -1 file

それを行うPOSIXの方法は ddです。最初にファイルの長さを決定し、次に1バイト未満に切り捨てます。

length=$(wc -c <file)
dd if=/dev/null of=file obs="$((length-1))" seek=1

これらの両方がファイルの最後のバイトを無条件に切り捨てることに注意してください。最初に改行であることを確認することをお勧めします。

length=$(wc -c <file)
if [ "$length" -ne 0 ] && [ -z "$(tail -c -1 <file)" ]; then
  # The file ends with a newline or null
  dd if=/dev/null of=file obs="$((length-1))" seek=1
fi

9
末尾の改行を削除するより良い方法perl -pi -e 'chomp if eof' myfileです。それに比べてtruncate、実際に末尾の改行がないdd場合、壊れたファイルが残されることはありmyfileません。
ハイエンジェル

2
@ Hi-Angel答えとしてそれを書くことをお勧めしますか?それは非常に良い答えだと思います。
サイモンフォースバーグ

@SimonForsbergありがとう、できました
こんにちは天使

17

ただし、次の方法で行から改行文字を削除できますtr -d '\n'

$ echo -e "Hello"
Hello
$ echo -e "Hello" | tr -d '\n'
Hello$

次の簡単な方法を使用して、ファイルの最後にある改行文字を削除できます。

  1. head -c -1 file

    からman head

    -c, --bytes=[-]K
              print the first K bytes of each file; with the leading '-',
              print all but the last K bytes of each file
  2. truncate -s -1 file

    からman truncate

    -s, --size=SIZE
              set or adjust the file size by SIZE

    SIZE is an integer and optional unit (example: 10M is 10*1024*1024).
    Units are K, M, G, T, P, E, Z, Y (powers of 1024) or KB, MB, ... (powers of 1000).
    
    SIZE  may  also be prefixed by one of the following modifying characters: 
    '+' extend by, '-' reduce by, '<' at most, '>' at least, '/' round down to multiple of, '%' round up to multiple of.

あるhead -c -1 file | tee file安全ですか?tee開始する前にファイルを切り捨てませんか?
-iruvar

1
@ 1_CR確かに。パイプの両側は並行して始まります。誰がレースに勝つかという問題です。以来teeだけが一方で、ファイルを開くために持ってhead読み、その内容を記述する必要があり、tee実際には非常に小さなファイルのために時々除いてレースに勝つだろう。
ジル「SO-悪をやめろ」

2
これは最後の改行を削除するのではなく、すべての改行を削除します。IMOはかなり大きな違いです。
ハイエンジェル

9

次のようにperlでこれを達成できます:

perl -pi -e 'chomp if eof' myfile

これに比べて、truncateまたは実際に末尾の改行がないdd場合、壊れたファイルが残されることはありmyfileません。

(回答はコメントから構築されこの回答に基づいています


ありがとうございました!削除するこの条件付きメソッドは、末尾の改行が最適です。
xer0x

2

ここでの一つの方法ですsed-最後に(上の$ファイルの)行、何も、すべての検索と置換(.*)「は、一致したものは何でも」「およびLinux」に続いて:

sed '$s/\(.*\)/\1 and Linux/' file

Isaacのご厚意による、さらに簡単なソリューションは次のとおりです。

sed '$s/$/ and Linux/' file

これにより、(シンボリックな)行末が指定されたテキストに置き換えられます。


アイザック、私はその提案が好きです!それはより単純で、より明白です。回答を更新します。ありがとうございました!
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.