Unix'teki \r
bir dosyadan tüm satır başlarını kaldırmanın en basit yolu nedir ?
Unix'teki \r
bir 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"
, 0x0d
at) 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 dos2unix
sizin için uygun değilse, o sed
zaman 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 sed
sizin için uygun değilse, o ed
zaman 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 :-)
\r
sadece GNU sed ile çalışır, aksi takdirde şunları yapabilirsiniz:sed `echo "s/\r//"`
sed
de echo
tanı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 \n
size ondan kaçmak gerekir)
tr -d '\r' < infile > outfile
Bkz. Tr (1)
tr
desteklemiyorsa \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 \r
bir kaçış + r olarak yorumlayacak ve bir ovaya indirecek r
ve tüm küçük harfleri kaldıracaktır r
. Bu yüzden Rob tarafından 2009'da verilen cevap işe yaramıyor.
Ve /g
değiştiricinin eklenmesi, \r
yalnızca ilkinin değil, birden fazla öğenin de kaldırılmasını sağlar .
sed -i s/\r// <filename>
veya bunun gibi; man sed
kullanı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\n
bunun 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 dos2unix
ve 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 yum
gibi yüklemenizi tavsiye ederim :
yum install dos2unix
Sonra şöyle kullanabilirsiniz:
dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
dos2unix
Komutu 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 ~/.bashrc
geçerli oturumda çalıştırdığınızda ) dos2unix
, komut satırındaki adı diğer örneklerle aynı şekilde kullanabilirsiniz.
Işte burada,
%0d
satı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)
.
\r
Herhangi 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 tcsh
için sh
henüz hala çok GNU / Linux üzerinde bile işe.
OS X, OpenBSD ve NetBSD girişlerinde ve tcsh
Debian GNU / Linux girişlerinde test edilmiştir bash
.
sed
:Gelen tcsh
bir OS X üzerinde, aşağıdaki sed
pasajı ile birlikte kullanılabilecek printf
ne kadar, sed
ne de echo
sap \r
GNU gibi özel bir şekilde yapar:
sed `printf 's/\r$//g'` input > output
tr
:Başka bir seçenek tr
:
tr -d '\r' < input > output
sed
ve tr
:OS X ve NetBSD'de (ancak OpenBSD veya GNU / Linux'ta değil) tr
giriş 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 \r
ya da \n
dosyanın en sonunda.
Bunun printf
ve üzerinde sisteminizin çalışmasını sağlamak için kullanılabilecek bazı örnek testler şunlardır hexdump -C
; alternatif od -c
olarak 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
...