Unix'teki \rbir dosyadan tüm satır başlarını kaldırmanın en basit yolu nedir ?
Unix'teki \rbir dosyadan tüm satır başlarını kaldırmanın en basit yolu nedir ?
Yanıtlar:
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 :-)
\rsadece GNU sed ile çalışır, aksi takdirde şunları yapabilirsiniz:sed `echo "s/\r//"`
sedde echotanınır \r. Bu durumda sadece çalışıyor printf "\r"gibi görünüyor.
sed "s/$(printf '\r')\$//"
$: şöyle sed $'s@\r@@g' |od -c (ama birlikte yerini alacak eğer \nsize ondan kaçmak gerekir)
tr -d '\r' < infile > outfile
Bkz. Tr (1)
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).
outfile = infile?
someProg <in >out && mv out in.
Eski okul:
tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns
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 .
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.
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.
^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'.
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.
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
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.
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
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"
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.
Notepad++komutunu kullanın Edit / EOL Conversion / Unix (LF).
\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.
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
tr:Başka bir seçenek tr:
tr -d '\r' < input > output
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.
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
%
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)
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
sadece bunu yapabilirsiniz:
$ echo $(cat input) > output
a * b...