Unix'te satır başını kaldır


Yanıtlar:


261

Sana ortalama satırbaşları (varsaymak gidiyorum CR, "\r", 0x0dat) uçları yerine sadece körlemesine dosya içinde birden hatların (eğer bildiğim dizeleri ortasında onlara sahip olabilir). Bu test dosyasını CRyalnızca ilk satırın sonunda a ile kullanma :

$ cat infile
hello
goodbye

$ cat infile | od -c
0000000   h   e   l   l   o  \r  \n   g   o   o   d   b   y   e  \n
0000017

dos2unix sisteminize yüklenmişse gitmenin yolu:

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Herhangi bir nedenle dos2unixsizin için uygun değilse, o sedzaman yapacak:

$ cat infile | sed 's/\r$//' | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Herhangi bir nedenle sedsizin için uygun değilse, o edzaman karmaşık bir şekilde yapacaksınız:

$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

Kutunuzda bu araçlardan herhangi biri yüklü değilse, dosyaları dönüştürmeye çalışmaktan daha büyük sorunlarınız var :-)


13
\rsadece GNU sed ile çalışır, aksi takdirde şunları yapabilirsiniz:sed `echo "s/\r//"`
lapo

15
Ne MacO'larda ne sedde echotanınır \r. Bu durumda sadece çalışıyor printf "\r"gibi görünüyor.
Steve Powell

30
@ Steve adlı kullanıcının yorumunu detaylandırmak için: Mac'te aşağıdakileri kullanın: sed "s/$(printf '\r')\$//"
mklement0

7
Mac düzeltme sorununa da birlikte dize sed tek alıntı öneki $: şöyle sed $'s@\r@@g' |od -c (ama birlikte yerini alacak eğer \nsize ondan kaçmak gerekir)
nhed

1
% 100 emin değilim, ama OS X için, işe yaramış gibi görünmek CTRL-V + CTRL-Myerine kullanmak \r.

240
tr -d '\r' < infile > outfile

Bkz. Tr (1)


4
Büyük değil: 1. yerinde çalışmaz, 2. yerine de EOL (ki olabilir veya olmayabilir ne olabilir ...) değiştirebilirsiniz.
Tomasz Gandor

10
1. Çoğu unixy araçları bu şekilde çalışır ve genellikle vidalanırsanız hala orijinaliniz olduğu için bir şeyler yapmak için en güvenli yoldur. 2. Belirtilen soru satır sonlarını dönüştürmek değil, satır başlarını kaldırmaktır. Ama size daha iyi hizmet edebilecek başka cevaplar da var.
Henrik Gustafsson

1
Sizin kaçışınızı trdesteklemiyorsa \r, deneyin '\015'veya belki bir değişmez '^M'(birçok terminaldeki birçok kabukta, ctrl-V ctrl-M değişmez bir ctrl-M karakteri üretecektir).
üçlü

Peki istediğiniz zaman kişi bunu nasıl değiştirir outfile = infile?
Christopher

3
: @donlan, geç yanıt ama genellikle böyle bir şey kullanın someProg <in >out && mv out in.
paxdiablo

38

Eski okul:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

32

Linux'taki en basit yol, benim düşünceme göre,

sed -i 's/\r$//g' <filename>

Güçlü tırnaklar ikame operatörü etrafında 's/\r//'olan esansiyel . Onlar olmadan kabuk \rbir kaçış + r olarak yorumlayacak ve bir ovaya indirecek rve tüm küçük harfleri kaldıracaktır r. Bu yüzden Rob tarafından 2009'da verilen cevap işe yaramıyor.

Ve /gdeğiştiricinin eklenmesi, \ryalnızca ilkinin değil, birden fazla öğenin de kaldırılmasını sağlar .



7

sed -i s/\r// <filename>veya bunun gibi; man sedkullanımıyla ilgili olarak web’deki mevcut bilgilere veya zenginliğe bakınız sed.

Belirtilmesi gereken bir şey, yukarıdaki "taşıma dönüşü" nün kesin anlamıdır; gerçekten tek bir kontrol karakteri "satırbaşı" demek istiyorsanız, o zaman yukarıdaki desen doğrudur. Daha genel olarak, CRLF (satır başı ve satır beslemesi, bu da satır beslemeleri Windows altında nasıl uygulanır) demek istediyseniz, \r\nbunun yerine muhtemelen değiştirmek istersiniz . Çıplak hat beslemeleri (newline) Linux / Unix'te \n.


-> sed 's / \ r \ n / = /' countryNew.txt> demo.txt çalışmıyor kullanmaya çalışıyorum. "kaplan" "Aslan".
Suvasis

Mac'te olduğun anlamına gelmeli mi? Darwin sed, varsayılan olarak çoğu Linux sürümünden farklı komutlara ve özellik setlerine sahip gibi görünüyor ...
jsh

4
FYI, s/\r//OS X'te satır rbaşını kaldırmıyor gibi, tam karakterleri kaldırıyor gibi görünüyor . Bunun neden hala olduğundan emin değilim. Belki de ipin alıntılanmasıyla bir ilgisi vardır? Çözüm olarak, kullanarak CTRL-V + CTRL-Myerine \rişe görünmektedir.

6

Vi kullanıcısıysanız, dosyayı açabilir ve şaryo iadesini şu yollarla kaldırabilirsiniz:

:%s/\r//g

veya ile

:1,$ s/^M//

Ctrl-v ve ardından ctrl-m tuşlarına basarak ^ M yazmanız gerektiğini unutmayın.


2
Büyük değil: dosya her satırda CR varsa (yani doğru bir DOS dosyasıysa), vim dosyayı filetype = dos ile yükler ve -s'yi göstermez ^M. Bu sorunu çözmek, vim için yapılmayan bir ton tuş vuruşudur;). Ben sadece gitmek istiyorum sed -i, ve sonra EOL de CRs kaldırılması sınırlamak için `` -e 's / \ r $ // g'.
Tomasz Gandor

6

Bir kez daha bir çözüm ... Çünkü her zaman bir tane daha var:

perl -i -pe 's/\r//' filename

Güzel çünkü yerinde ve birlikte çalıştığım unix / linux her lezzet çalışır.


3

Birisi tavsiye dos2unixve ben de şiddetle tavsiye ederim. Sadece daha fazla ayrıntı veriyorum.

Takılıysa, bir sonraki adıma geçin. Zaten yüklü değilse, aşağıdaki yumgibi yüklemenizi tavsiye ederim :

yum install dos2unix

Sonra şöyle kullanabilirsiniz:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

2

dos2unixKomutu olmayan ancak Python yorumlayıcısı (sürüm 2.5+) olan bir işletim sistemi (OS X gibi ) kullanıyorsanız, bu komut komuta eşdeğerdir dos2unix:

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"

Bu, hem komut satırındaki adlandırılmış dosyaları, hem de borular ve yönlendirmeleri işler dos2unix. Bu satırı ~ / .bashrc dosyanıza (veya diğer kabuklar için eşdeğer profil dosyasına) eklerseniz:

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""

... bir sonraki oturum açışınızda (veya source ~/.bashrcgeçerli oturumda çalıştırdığınızda ) dos2unix, komut satırındaki adı diğer örneklerle aynı şekilde kullanabilirsiniz.


2

Işte burada,

%0dsatır başı karakteri. Unix ile uyumlu hale getirmek için. Aşağıdaki komutu kullanmamız gerekiyor.

dos2unix fileName.extension fileName.extension


1

dos dosyasını unix dosyasına dönüştürmek için bunu deneyin:

fromdos dosyası


1

UNIX için ... dos2unix, Unicode başlıklarını UTF-8 dosyamdan kaldırdığımı fark ettim. Git bash (Windows) altında, aşağıdaki komut dosyası iyi çalışıyor gibi görünüyor. Sed kullanır. Yalnızca satır sonlarındaki satır başını kaldırdığını ve Unicode başlıklarını koruduğunu unutmayın.

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

1

Bir X ortamı çalıştırıyorsanız ve uygun bir düzenleyiciye (görsel stüdyo kodu) sahipseniz, şu öneriyi takip ederim:

Visual Studio Code: Satır sonlarını gösterme

Sadece ekranınızın sağ alt köşesine gidin, görsel stüdyo kodu size hem dosya kodlamasını hem de satır sonu kuralını ve ardından dosyayı gösterecektir, sadece basit bir tıklama ile bunu değiştirebilirsiniz.

Bir linux ortamında notepad ++ yerine görsel kod kullanmanız yeterlidir.


Veya dosyayı Linux sisteminize kopyalamadan önce Windows sisteminizde Notepad++komutunu kullanın Edit / EOL Conversion / Unix (LF).
Jesse Chisholm

1

\rHerhangi bir UNIX® sistemini kaldırma :

Bu sorudaki mevcut çözümlerin çoğu GNU'ya özgüdür ve OS X veya BSD üzerinde çalışmaz; Aşağıdaki çözümler dışında, daha birçok UNIX sistemleri üzerinde çalışacak ve herhangi bir kabuk içinde olmalıdır tcshiçin shhenüz hala çok GNU / Linux üzerinde bile işe.

OS X, OpenBSD ve NetBSD girişlerinde ve tcshDebian GNU / Linux girişlerinde test edilmiştir bash.


İle sed:

Gelen tcshbir OS X üzerinde, aşağıdaki sedpasajı ile birlikte kullanılabilecek printfne kadar, sedne de echosap \rGNU gibi özel bir şekilde yapar:

sed `printf 's/\r$//g'` input > output

İle tr:

Başka bir seçenek tr:

tr -d '\r' < input > output

Fark arasında sedve tr:

OS X ve NetBSD'de (ancak OpenBSD veya GNU / Linux'ta değil) trgiriş dosyasından sondaki yeni satır eksikliğini koruduğu anlaşılırken sed, giriş eksik olsa bile dosyanın sonuna bir son satır ekler arka \rya da \ndosyanın en sonunda.


Test yapmak:

Bunun printfve üzerinde sisteminizin çalışmasını sağlamak için kullanılabilecek bazı örnek testler şunlardır hexdump -C; alternatif od -colarak sisteminiz eksikse de kullanılabilir hexdump:

% printf 'a\r\nb\r\nc' | hexdump -C
00000000  61 0d 0a 62 0d 0a 63                              |a..b..c|
00000007
% printf 'a\r\nb\r\nc' | ( sed `printf 's/\r$//g'` /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
00000006
% printf 'a\r\nb\r\nc' | ( tr -d '\r' < /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63                                    |a.b.c|
00000005
% 

0

Bunun için python kullandım, burada kodum;

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

0

Eski bir yazı olmasına rağmen, son zamanlarda aynı sorunla karşılaştım. Ben / tmp / blah_dir / içinde yeniden adlandırmak için tüm dosyaları vardı gibi bu dizindeki her dosya "/ r" sondaki karakteri (dosya sonunda "?" Gösteren) vardı, bu yüzden komut dosyası yolu yapmak sadece düşünebiliyordu oldu.

Nihai dosyayı aynı isimle kaydetmek istedim (herhangi bir karakteri takip etmeden). Sed ile sorun başka bir şeyden bahsetmek için gerekli çıktı dosya adı (ki ben istemiyordu) oldu.

Burada önerilen diğer seçenekler denedim (bazı sınırlamalar nedeniyle dos2unix olarak kabul edilmez) ama işe yaramadı.

Sonunda "awk" ile denedim nerede sınırlayıcı olarak "\ r" kullanılan ve ilk bölümü aldı :

hile:

echo ${filename}|awk -F"\r" '{print $1}'

Komut snippet'inin altında kullandığım (burada tüm dosya yolumda / tmp / blah_dir / konumunda son karakter olarak "r" vardı):

cd /tmp/blah_dir/
for i in `ls`
  do
    mv   $i     $(echo $i | awk -F"\r" '{print $1}')
done

Not: Bu örnek çalıştığım şeye yakın olsa da çok kesin değil (Sadece yaptığım şey hakkında daha iyi fikir vermek için burada bahsediyoruz)


0

Bu kabuk komut dosyasını \ r karakterini kaldırmak için yaptım. Solaris ve kırmızı şapkalı çalışır:

#!/bin/ksh

LOCALPATH=/Any_PATH

for File in `ls ${LOCALPATH}`
do
   ARCACT=${LOCALPATH}/${File}
   od -bc ${ARCACT}|sed -n 'p;n'|sed 's/015/012/g'|awk '{$1=""; print $0}'|sed 's/ /\\/g'|awk '{printf $0;}'>${ARCACT}.TMP
   printf "`cat ${ARCACT}.TMP`"|sed '/^$/d'>${ARCACT}
   rm ${ARCACT}.TMP
done

exit 0

-1

sadece bunu yapabilirsiniz:

$ echo $(cat input) > output

Birinin neden '-1' verdiğini bilmiyorum. Bu mükemmel bir cevap (ve benim için çalışan tek cevap).
FractalSpace

1
Üzgünüm, o bendim. Bekle, bak, gerçekten '\ r' için çalışmıyor!
Viacheslav Rodionov

1
@FractalSpace Bu korkunç bir fikir! Dosyadaki tüm boşlukları tamamen yazar ve dosyanın tüm içeriğini kabuk tarafından yoruma tabi tutar. Bir satır içeren bir dosya ile deneyin a * b...
Tom Fenech
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.