web-dev-qa-db-ja.com

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

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

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

ここでは、file1の末尾に改行文字があるのに対し、file2にはないのがわかります。

ここで、1つのfileがあるとします。

$ cat file
Hello
Welcome to
Unix
$

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

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

45
Pandya

最終行にテキストを追加するだけの場合は、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

ただし、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.
    
21
Pandya

あなたはPerlでこれを達成することができます:

Perl -pi -e 'chomp if eof' myfile

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

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

16
Hi-Angel

これがsedを使った1つの方法です-最後の($)ファイルの行を検索し、あらゆるものを置き換えます(.*)「一致したものは何でも」の後に「およびLinux」が続きます:

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

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

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

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

3
Jeff Schaller