मैं प्रोग्रामेटिक रूप से (अर्थात, उपयोग नहीं कर रहा vi
) DOS / Windows के नए लिंक को यूनिक्स में कैसे बदल सकता हूं ?
dos2unix
और unix2dos
आदेशों कुछ सिस्टम पर उपलब्ध नहीं हैं। मैं कैसे sed
/ awk
/ जैसे आदेशों के साथ इनका अनुकरण कर सकता हूं tr
?
मैं प्रोग्रामेटिक रूप से (अर्थात, उपयोग नहीं कर रहा vi
) DOS / Windows के नए लिंक को यूनिक्स में कैसे बदल सकता हूं ?
dos2unix
और unix2dos
आदेशों कुछ सिस्टम पर उपलब्ध नहीं हैं। मैं कैसे sed
/ awk
/ जैसे आदेशों के साथ इनका अनुकरण कर सकता हूं tr
?
जवाबों:
आप tr
डॉस से यूनिक्स में बदलने के लिए उपयोग कर सकते हैं ; हालाँकि, आप इसे केवल सुरक्षित रूप से कर सकते हैं यदि CR आपकी फ़ाइल में केवल CRLF बाइट जोड़ी के पहले बाइट के रूप में दिखाई देता है। यह आमतौर पर मामला है। आप तब उपयोग करते हैं:
tr -d '\015' <DOS-file >UNIX-file
ध्यान दें कि नाम नाम DOS-file
से अलग है UNIX-file
; यदि आप एक ही नाम का दो बार उपयोग करने का प्रयास करते हैं, तो आप फ़ाइल में कोई डेटा नहीं रखेंगे।
आप इसे दूसरे तरीके से नहीं कर सकते (मानक 'tr' के साथ)।
यदि आप जानते हैं कि गाड़ी को एक स्क्रिप्ट में कैसे वापस जाना है ( control-V, control-Mकंट्रोल-एम दर्ज करने के लिए), तो:
sed 's/^M$//' # DOS to Unix
sed 's/$/^M/' # Unix to DOS
जहां '^ M' कंट्रोल-एम कैरेक्टर है। गाड़ी वापसी को निर्दिष्ट करने के लिए आप bash
एएनएसआई-सी कोटिंग तंत्र का भी उपयोग कर सकते हैं:
sed $'s/\r$//' # DOS to Unix
sed $'s/$/\r/' # Unix to DOS
हालांकि, अगर आप इस बहुत बार ऐसा करने के लिए करने जा रहे हैं (एक से अधिक बार, मोटे तौर पर बोल रहा है), यह कहीं अधिक समझदार रूपांतरण प्रोग्राम इंस्टॉल करने का है (उदाहरण के लिए dos2unix
और unix2dos
, या शायद dtou
और utod
) और उन्हें का उपयोग करें।
यदि आपको संपूर्ण निर्देशिकाओं और उपनिर्देशिकाओं को संसाधित करने की आवश्यकता है, तो आप उपयोग कर सकते हैं zip
:
zip -r -ll zipfile.zip somedir/
unzip zipfile.zip
यह CRLF से CR में परिवर्तित लाइन एंडिंग के साथ एक ज़िप आर्काइव बनाएगा। unzip
फिर परिवर्तित फ़ाइलों को वापस रख देगा (और आपसे फ़ाइल पूछेगा - आप जवाब दे सकते हैं: हाँ-से-सभी)। इसे इंगित करने के लिए @vmsnomad को श्रेय।
tr -d '\015' <DOS-file >UNIX-file
जहाँ DOS-file
== का उपयोग करके UNIX-file
केवल एक खाली फ़ाइल में परिणाम होता है। दुर्भाग्य से आउटपुट फ़ाइल को एक अलग फ़ाइल होना चाहिए।
sed
विकल्प -i
(इन-प्लेस के लिए) काम करता है; सीमाएं जुड़ी हुई फाइलें और सीमलाइंक हैं। sort
आदेश है 'हमेशा' (1979 से पहले नहीं तो) समर्थित -o
विकल्प जो इनपुट फ़ाइलों में से एक सूचीबद्ध कर सकते हैं। हालाँकि, यह भाग में है क्योंकि sort
इसके किसी भी आउटपुट को लिखने से पहले इसके सभी इनपुट को अवश्य पढ़ना चाहिए। अन्य कार्यक्रम छिटपुट रूप से उनकी एक इनपुट फाइल को अधिलेखित करने का समर्थन करते हैं। कर्निघन और पाइक द्वारा 'द यूनिक्स प्रोग्रामिंग पर्यावरण' में समस्याओं से बचने के लिए आप एक सामान्य उद्देश्य कार्यक्रम (स्क्रिप्ट) पा सकते हैं ।
sed -i $'s/\r$//' filename
- जगह में संपादित करने के लिए। मैं एक ऐसी मशीन पर काम कर रहा हूं जिसमें इंटरनेट तक पहुंच नहीं है, इसलिए सॉफ्टवेयर इंस्टॉलेशन एक समस्या है।
tr -d "\r" < file
उपयोग करने वाले उदाहरणों के लिए यहां एक नज़र डालें sed
:
# IN UNIX ENVIRONMENT: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//' # assumes that all lines end with CR/LF
sed 's/^M$//' # in bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//' # works on ssed, gsed 3.02.80 or higher
# IN UNIX ENVIRONMENT: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/" # command line under ksh
sed 's/$'"/`echo \\\r`/" # command line under bash
sed "s/$/`echo \\\r`/" # command line under zsh
sed 's/$/\r/' # gsed 3.02.80 or higher
sed -i
इन-प्लेस रूपांतरण के लिए उपयोग करें sed -i 's/..../' file
।
\r
:tr "\r" "\n" < infile > outfile
-d
अधिक बार चित्रित किया जाता है और "केवल \r
" स्थिति में मदद नहीं करेगा ।
\r
करने के लिए \n
मानचित्रण डबल रिक्ति फ़ाइलों का प्रभाव पड़ता है; डॉस में समाप्त होने वाली प्रत्येक सिंगल सीआरएलएफ लाइन \n\n
यूनिक्स में बन जाती है।
POSIX के साथ ऐसा करना मुश्किल है:
POSIX Sed समर्थन नहीं करता है \r
या \15
। यहां तक कि अगर यह किया, जगह विकल्प -i
में POSIX नहीं है
POSIX Awk समर्थन करता है \r
और \15
, हालांकि -i inplace
विकल्प POSIX नहीं है
d2u और dos2unix POSIX उपयोगिताओं नहीं हैं , लेकिन पूर्व है
POSIX पूर्व का समर्थन नहीं करता \r
, \15
, \n
या\12
कैरिज रिटर्न निकालने के लिए:
ex -bsc '%!awk "{sub(/\r/,\"\")}1"' -cx file
गाड़ी का रिटर्न जोड़ने के लिए:
ex -bsc '%!awk "{sub(/$/,\"\r\")}1"' -cx file
tr
सपोर्ट करता है \r
। तो आप भी उपयोग कर सकते हैं printf '%s\n' '%!tr -d "\r"' x | ex file
(हालांकि दी गई, इसे हटा दिया गया, \r
भले ही तुरंत पूर्व न हो \n
)। इसके अलावा, -b
विकल्प ex
POSIX द्वारा निर्दिष्ट नहीं है।
आप v-प्रोग्राम का उपयोग विकल्प -c {कमांड} के साथ कर सकते हैं:
डॉस टू यूनिक्स:
vim file.txt -c "set ff=unix" -c ":wq"
यूनिक्स से डॉस:
vim file.txt -c "set ff=dos" -c ":wq"
"सेट एफएफ = यूनिक्स / डॉस" का अर्थ फाइल के फाइलफॉर्मैट (एफएफ) को यूनिक्स / डॉस ऑफ एंड फॉर्मेट के अंत में बदलना है।
", wq" का अर्थ है डिस्क पर फ़ाइल लिखना और संपादक को छोड़ना (लूप में कमांड का उपयोग करने की अनुमति देना)
vi
करेगा उसे पता होगा कि :wq
इसका क्या मतलब है। उन लोगों के लिए जो 3 वर्णों का अर्थ नहीं है 1) खुले vi कमांड क्षेत्र, 2) लिखना और 3) छोड़ना।
जगह उपयोग में एक फ़ाइल परिवर्तित करने के लिए
dos2unix <filename>
परिवर्तित पाठ को किसी भिन्न फ़ाइल उपयोग के लिए आउटपुट करने के लिए
dos2unix -n <input-file> <output-file>
आप इसे उबंटू या डेबियन के साथ स्थापित कर सकते हैं
sudo apt install dos2unix
या homebrew का उपयोग कर macOS पर
brew install dos2unix
इस समस्या को मानक उपकरणों के साथ हल किया जा सकता है, लेकिन मैं जिस flip
कमांड को स्थापित करने की सलाह देता हूं, उसके लिए पर्याप्त रूप से कई जाल हैं , जो कि 20 साल पहले राहुल ढेसी के लेखक द्वारा लिखा गया था zoo
। यह एक उत्कृष्ट कार्य करता है, जबकि फ़ाइल स्वरूपों को परिवर्तित करना, उदाहरण के लिए, द्विआधारी फ़ाइलों के अनजाने विनाश से बचना, जो कि बहुत आसान है यदि आप हर CRLF को बदलने के आसपास दौड़ लगाते हैं ...
अभी तक पोस्ट किए गए समाधान केवल समस्या के भाग से निपटते हैं, डॉस / विंडोज 'सीआरएलएफ को यूनिक्स के एलएफ में परिवर्तित करते हैं; वह हिस्सा जो गायब है वह यह है कि डॉस सीआरएलएफ को एक लाइन विभाजक के रूप में उपयोग करता है, जबकि यूनिक्स लाइन टर्मिनेटर के रूप में एलएफ का उपयोग करता है । अंतर यह है कि डॉस फ़ाइल (आमतौर पर) फ़ाइल में अंतिम पंक्ति के बाद कुछ भी नहीं होगा, जबकि यूनिक्स होगा। रूपांतरण को ठीक से करने के लिए, आपको उस अंतिम LF को जोड़ना होगा (जब तक कि फ़ाइल शून्य-लंबाई न हो, अर्थात इसमें कोई रेखा न हो)। इसके लिए मेरा पसंदीदा झुकाव (मैक-सीआर-अलग-अलग फ़ाइलों को संभालने के लिए थोड़ा जोड़ा तर्क के साथ, और मोलेस्ट फाइलें नहीं हैं जो पहले से ही यूनिक्स प्रारूप में हैं) थोड़ा सा है:
perl -pe 'if ( s/\r\n?/\n/g ) { $f=1 }; if ( $f || ! $m ) { s/([^\n])\z/$1\n/ }; $m=1' PCfile.txt
ध्यान दें कि यह फ़ाइल का Unixified संस्करण stdout को भेजता है। यदि आप फ़ाइल को एक यूनिफ़ाइड संस्करण के साथ बदलना चाहते हैं, तो पर्ल का -i
ध्वज जोड़ें ।
यदि आपके पास dos2unix तक पहुँच नहीं है , लेकिन इस पृष्ठ को पढ़ सकते हैं, तो आप यहाँ से dos2unix.py को कॉपी / पेस्ट कर सकते हैं।
#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys
if len(sys.argv[1:]) != 2:
sys.exit(__doc__)
content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
content = infile.read()
with open(sys.argv[2], 'wb') as output:
for line in content.splitlines():
outsize += len(line) + 1
output.write(line + '\n')
print("Done. Saved %s bytes." % (len(content)-outsize))
सुपरसुसर से क्रॉस-पोस्टेड ।
dos2unix
परिवर्तित करता है । आपका उपयोग पैरामीटर का तात्पर्य है। और असली एक फिल्टर है जो स्टड से पढ़ता है, अगर फाइल नहीं दी जाती है तो स्टडआउट को लिखता है। -n
dos2unix
PCRE के साथ सुपर डुपर आसान;
एक स्क्रिप्ट के रूप में, या $@
अपनी फ़ाइलों के साथ बदलें ।
#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@
यह आपकी फ़ाइलों को जगह में लिख देगा!
मैं केवल एक बैकअप के साथ ऐसा करने की सलाह देता हूं (संस्करण नियंत्रण या अन्यथा)
--
। मैंने इस समाधान को चुना क्योंकि यह मेरे लिए समझना और अनुकूलित करना आसान है। FYI करें, यह स्विच क्या करता है: -p
एक "इनपुट करते समय" मान लें, -i
जगह में इनपुट फ़ाइल को संपादित करें, -e
कमांड का पालन करें
एक भी सरल awk समाधान w / oa कार्यक्रम:
awk -v ORS='\r\n' '1' unix.txt > dos.txt
तकनीकी रूप से '1' आपका प्रोग्राम है, b / c awk को दिए गए विकल्प में से एक की आवश्यकता होती है।
अद्यतन : लंबे समय के बाद पहली बार इस पृष्ठ को फिर से देखने के बाद मैंने महसूस किया कि किसी ने अभी तक एक आंतरिक समाधान पोस्ट नहीं किया है, इसलिए यहां एक है:
while IFS= read -r line;
do printf '%s\n' "${line%$'\r'}";
done < dos.txt > unix.txt
awk -v RS='\r\n' '1' dos.txt > unix.txt
awk
या sed
समाधान की तुलना में बहुत धीमा है । इसके अलावा, आपको while IFS= read -r line
विश्वासपूर्वक इनपुट लाइनों को संरक्षित करने के लिए उपयोग करना चाहिए , अन्यथा प्रमुख और अनुगामी व्हाट्सएप को ट्रिम किया जाता है (वैकल्पिक रूप से, read
कमांड में कोई चर नाम का उपयोग न करें और साथ काम करें $REPLY
)।
बस उसी प्रश्न पर विचार करना था (विंडोज की तरफ, लेकिन समान रूप से लिनक्स पर लागू होता है।) किसी ने भी CRLF करने का बहुत ही स्वचालित तरीके का उल्लेख नहीं किया है -> अच्छे पुराने zip -ll
विकल्प (Info-ZIP) का उपयोग करके पाठ-फ़ाइलों के लिए LF रूपांतरण :
zip -ll textfiles-lf.zip files-with-crlf-eol.*
unzip textfiles-lf.zip
नोट: यह एक ज़िप फ़ाइल बनाएगा जो मूल फ़ाइल नामों को संरक्षित करेगा लेकिन लाइन अंत को LF में परिवर्तित करेगा। फिर unzip
फ़ाइलों को zip'ed के रूप में निकालेगा, जो कि उनके मूल नामों (लेकिन LF-endings के साथ) के साथ है, इस प्रकार स्थानीय मूल फ़ाइलों को अधिलेखित करने के लिए यदि कोई हो।
प्रासंगिक अंश zip --help
:
zip --help
...
-l convert LF to CR LF (-ll CR LF to LF)
खिड़कियों पर मेरे गिट-बैश में दिलचस्प sed ""
चाल पहले से ही किया था:
$ echo -e "abc\r" >tst.txt
$ file tst.txt
tst.txt: ASCII text, with CRLF line terminators
$ sed -i "" tst.txt
$ file tst.txt
tst.txt: ASCII text
मेरा अनुमान है कि इनपुट से लाइनें पढ़ते समय sed उनकी उपेक्षा करता है और हमेशा आउटपुट पर यूनिक्स लाइन अंत लिखता है।
यदि आपने होमब्रे को स्थापित किया है तो मैक ओएसएक्स के लिए [ http://brew.sh/desing1]
brew install dos2unix
for csv in *.csv; do dos2unix -c mac ${csv}; done;
सुनिश्चित करें कि आपने फ़ाइलों की प्रतियां बना ली हैं, क्योंकि यह कमांड फाइलों को जगह में बदल देगी। -C मैक विकल्प स्विच को ऑक्स के साथ संगत बनाता है।
-c mac
, जो पूर्व-ओएस एक्स-ऑनलाइन CR
नईलाइन्स को परिवर्तित करने के लिए है। आप केवल मैक ओएस 9 या उससे पहले की फ़ाइलों के लिए उस मोड का उपयोग करना चाहते हैं।
आप awk का उपयोग कर सकते हैं। रिकॉर्ड विभाजक ( RS
) को एक regexp पर सेट करें जो सभी संभावित नईलाइन वर्ण, या वर्णों से मेल खाता है। और ORS
यूनिक्स शैली की न्यूलाइन कैरेक्टर में आउटपुट रिकॉर्ड सेपरेटर ( ) सेट करें ।
awk 'BEGIN{RS="\r|\n|\r\n|\n\r";ORS="\n"}{print}' windows_or_macos.txt > unix.txt
git diff
दिखाता है ^ M, vim में संपादित)
लिनक्स पर M M (ctrl-M) को * nix newlines (^ J) सेड के साथ परिवर्तित करना आसान है।
यह सीएलआई पर कुछ इस तरह होगा, वास्तव में पाठ में एक लाइन ब्रेक होगा। हालाँकि, \ N कि ^ J के साथ sed में गुजरता है:
sed 's/^M/\
/g' < ffmpeg.log > new.log
आप इसे टाइप करते हुए ^ V (ctrl-V), ^ M (ctrl-M) और \ (बैकस्लैश) का उपयोग करके प्राप्त करते हैं:
sed 's/^V^M/\^V^J/g' < ffmpeg.log > new.log
sed --expression='s/\r\n/\n/g'
चूँकि प्रश्न में sed का उल्लेख है, यह इसे प्राप्त करने के लिए sed का उपयोग करने का सबसे सीधा तरीका है। अभिव्यक्ति जो कहती है वह सभी कैरिज-रिटर्न और लाइन-फीड को केवल लाइन-फीड से बदल देती है। जब आप विंडोज से यूनिक्स में जाते हैं, तो आपको इसकी आवश्यकता होती है। मैंने सत्यापित किया कि यह काम करता है।
मैंने स्वीकृत उत्तर के आधार पर एक स्क्रिप्ट बनाई ताकि आप अंत में एक अतिरिक्त फ़ाइल की आवश्यकता के बिना इसे सीधे रूपांतरित कर सकें और बाद में इसे हटा और नाम बदल सकें।
convert-crlf-to-lf() {
file="$1"
tr -d '\015' <"$file" >"$file"2
rm -rf "$file"
mv "$file"2 "$file"
}
बस सुनिश्चित करें कि यदि आपके पास "file1.txt" जैसी कोई फ़ाइल है जो "file1.txt2" पहले से मौजूद नहीं है या इसे अधिलेखित कर दिया जाएगा, तो मैं इसे फ़ाइल को संग्रहीत करने के लिए एक अस्थायी स्थान के रूप में उपयोग करता हूं।
मैंने OSX पर 's / ^ M $ //' फ़ाइल की कोशिश की। साथ ही कई अन्य तरीके ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- डॉस-लाइन-एंडिंग्स या http://hintsforums.macworld.com/archive/index.php/t-125.html )। किसी ने काम नहीं किया, फ़ाइल अपरिवर्तित रही (btw Ctrl-v Enter को ^ M को पुन: पेश करने की आवश्यकता थी)। अंत में मैंने TextWrangler का उपयोग किया। इसकी कड़ाई से कमांड लाइन नहीं है, लेकिन यह काम करता है और यह शिकायत नहीं करता है।
dos2unix
अपने पैकेज मैनेजर का उपयोग करके इंस्टॉल करें, यह वास्तव में बहुत सरल है और अधिकांश प्लेटफार्मों पर मौजूद है।