Dosya sonunda newline karakterini nasıl kaldırırım?


34

Newline karakteri hakkında bilgi vereyim:

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

Burada file1sonunda newline karakterinin file2var olmadığını göreceksiniz .

Şimdi bir tane olduğumu varsayalım file:

$ cat file
Hello
Welcome to
Unix
$

Ve and Linuxdosyanın sonuna eklemek istiyorum , sonra echo " and Linux" >> filenewline'a eklenecek. Ama ben son satırı istiyorumUnix and Linux

Bu nedenle, çalışmak için dosyanın sonunda yeni satır karakterini kaldırmak istiyorum. Bu nedenle, dosyanın sonundaki newline karakterini nasıl kaldırabilirim?


6
Çıkarma, sadece bir metin editörü kullan. sed '$s/$/ and linux/'
123

Yanıtlar:


28

Tek yapmak istediğiniz son satıra metin eklemekse, sed ile çok kolaydır. Değiştir $yalnızca aralıktaki hatlarda, eklemek istediğiniz metin ile (satırın sonunda desen eşleştirme) $(son satırı anlamına gelir).

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

hangi Linux'ta kısaltılabilir

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

Bir dosyadaki son baytı kaldırmak istiyorsanız, Linux (daha doğrusu GNU coreutils) truncatekomutu çok kolaylaştıran bir komut sunar .

truncate -s -1 file

Bunu yapmanın bir POSIX yolu dd. Önce dosya uzunluğunu belirleyin, ardından bir bayt daha az kesin.

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

Bunların her ikisinin de koşulsuz olarak dosyanın son baytını kısalttığına dikkat edin. İlk önce yeni bir satır olup olmadığını kontrol etmek isteyebilirsiniz:

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
Çok daha iyi bir eğik yeni satır kaldırmak için bir yol olduğunu perl -pi -e 'chomp if eof' myfile. İle karşılaştırıldığında truncateya ddeğer kırık bir dosya ile sizi bırakmayacağım myfileaslında hiçbir sondaki yeni satır vardı.
Hi-Angel

2
@ Hi-Angel Bunu bir cevap olarak yazabilir miyim? Bunun çok iyi bir cevap olacağını düşünüyorum.
Simon Forsberg

@SimonForsberg teşekkürler, bitti .
Hi-Angel

17

Yine de, newline karakterini satırdan kaldırabilirsiniz tr -d '\n':

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

Aşağıdaki satır sonunu kullanarak newline karakterini dosyanın sonunda kaldırabilirsiniz:

  1. head -c -1 file

    Kimden 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

    from 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.

olan head -c -1 file | tee filegüvenli? Olmaz teebaşlamadan önce dosyayı kesmek?
iruvar

1
@ 1_CR Gerçekten. Borunun iki tarafı paralel olarak başlar, yarışı kim kazanırsa meselesidir. Yana teesadece, oysa dosyayı açmak zorundadır headiçeriğini okuma ve yazma vardır, teepratikte çok küçük dosyalar için bazen hariç yarışı kazanacak.
Gilles 'SO- kötülük olmayı bırak'

2
Bu son yeni satırı kaldırmaz, tüm yeni satırları kaldırır. IMO oldukça büyük bir fark.
Hi-Angel

9

Bunu perl ile şöyle yapabilirsiniz:

perl -pi -e 'chomp if eof' myfile

Bununla karşılaştırıldığında truncateya da takip eden yeni hatları ddyoksa myfile, sizi bozuk bir dosyayla bırakmayacaksınız .

(Cevap yorumdan yapılmıştır ve bu cevaba dayanır )


Teşekkür ederim! Bu koşullu kaldırma yöntemi izleyen newline mükemmeldir.
xer0x

2

Burada ile bir yolu sed- Son (açık $dosyanın) hattı, arama ve şey ve her şey (yerine .*"sen eşleşti ne olursa olsun" "ve Linux" izledi birlikte):

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

Daha basit bir çözüm, Isaac'in izniyle :

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

Bu (sembolik) satır sonunu verilen metinle değiştirir.


Isaac, bu öneriyi beğendim! Daha basit / daha açık. Cevabı bununla güncelleyeceğim. Teşekkür ederim!
Jeff Schaller
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.