আমি কীভাবে প্রোগ্রামটিমেটিকভাবে (যেমন ব্যবহার না করে vi) ডস / উইন্ডোজ নিউলাইনগুলিকে ইউনিক্সে রূপান্তর করতে পারি?
dos2unixএবং unix2dosকমান্ড নির্দিষ্ট সিস্টেমে উপলব্ধ নয়। আমি কীভাবে sed/ awk/ এর মতো কমান্ড দিয়ে এগুলি অনুকরণ করতে পারি tr?
আমি কীভাবে প্রোগ্রামটিমেটিকভাবে (যেমন ব্যবহার না করে vi) ডস / উইন্ডোজ নিউলাইনগুলিকে ইউনিক্সে রূপান্তর করতে পারি?
dos2unixএবং unix2dosকমান্ড নির্দিষ্ট সিস্টেমে উপলব্ধ নয়। আমি কীভাবে sed/ awk/ এর মতো কমান্ড দিয়ে এগুলি অনুকরণ করতে পারি tr?
উত্তর:
আপনি trডস থেকে ইউনিক্সে রূপান্তর করতে ব্যবহার করতে পারেন ; তবে, সিআরএল কেবলমাত্র কোনও সিআরএলএফ বাইট জুটির প্রথম বাইট হিসাবে আপনার ফাইলে উপস্থিত হলে আপনি নিরাপদে এটি করতে পারবেন। সাধারণত এটি হয়। তারপরে আপনি ব্যবহার করুন:
tr -d '\015' <DOS-file >UNIX-file
মনে রাখবেন যে নামটি নামের DOS-fileথেকে পৃথক UNIX-file; যদি আপনি একই নামটি দু'বার ব্যবহার করার চেষ্টা করেন তবে আপনার ফাইলটিতে কোনও ডেটা থাকবে না।
আপনি অন্যভাবে এটি করতে পারবেন না (স্ট্যান্ডার্ড 'টিআর' দিয়ে)।
যদি আপনি কীভাবে গাড়ীতে প্রবেশ করতে চান তবে কোনও স্ক্রিপ্টে ফিরে ( control-V, control-Mনিয়ন্ত্রণ-এমতে প্রবেশ করতে), তবে:
sed 's/^M$//' # DOS to Unix
sed 's/$/^M/' # Unix to DOS
যেখানে '^ এম' হল নিয়ন্ত্রণ-এম অক্ষর character আপনি গাড়ীর রিটার্ন নির্দিষ্ট করতে 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
এটি সিআরএলএফ থেকে সিআর-এ পরিবর্তিত লাইনের শেষের সাথে একটি জিপ সংরক্ষণাগার তৈরি করবে। unzipএরপরে রূপান্তরিত ফাইলগুলি আবার জায়গায় ফেলা হবে (এবং আপনাকে ফাইলের মাধ্যমে ফাইলটি জিজ্ঞাসা করুন - আপনি উত্তর দিতে পারেন: হ্যাঁ-টু-অল)। এটি নির্দেশ করার জন্য @vmsnomad এর ক্রেডিট।
tr -d '\015' <DOS-file >UNIX-fileযেখানে DOS-file== ব্যবহার করে UNIX-fileখালি ফাইলের ফলাফল হয়। দুর্ভাগ্যক্রমে আউটপুট ফাইলটি আলাদা ফাইল হতে হবে।
sedবিকল্পটি -i(ইন-প্লেসে) কাজ করে; সীমা লিঙ্কযুক্ত ফাইল এবং symlinks হয়। 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ইউনিক্সে পরিণত হয়।
পসিক্স দিয়ে এটি করা কঠিন:
পসিক্স শেড সমর্থন করে না \rবা \15। এমনকি যদি তা করে, তবে স্থানটির বিকল্পটি -iপসিক্স নয়
পসিএক্স আওক সমর্থন করে \rএবং \15, তবে -i inplaceবিকল্পটি পসিক্স নয়
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।
আপনি -c {কমান্ড option বিকল্পটি দিয়ে vim প্রোগ্রামমেটিক্যালি ব্যবহার করতে পারেন:
ইউনিক্সে করণীয়:
vim file.txt -c "set ff=unix" -c ":wq"
ইউনিক্স থেকে ডস:
vim file.txt -c "set ff=dos" -c ":wq"
"সেট এফএফ = ইউনিক্স / ডস" মানে ফাইলের ফাইল ফর্ম্যাট (এফএফ) লাইন বিন্যাসের শেষে ইউনিক্স / ডস এ পরিবর্তন করুন
": wq" এর অর্থ ডিস্কে ফাইল লিখুন এবং সম্পাদকটি ছেড়ে দিন (একটি লুপে কমান্ডটি ব্যবহার করার অনুমতি দেয়)
viসে এর :wqঅর্থ বুঝতে পারবে will তাদের জন্য যা 3 টি অক্ষর বোঝায় না 1) ওপেন vi কমান্ড অঞ্চল, 2) লিখুন এবং 3) প্রস্থান করুন।
জায়গা ব্যবহারে একটি ফাইল রূপান্তর করতে
dos2unix <filename>
পরিবর্তিত পাঠ্যকে আলাদা ফাইলের আউটপুট দিতে
dos2unix -n <input-file> <output-file>
আপনি এটি উবুন্টু বা ডেবিয়ান দিয়ে ইনস্টল করতে পারেন
sudo apt install dos2unix
বা ম্যাকোজে হোমব্রিউ ব্যবহার করে
brew install dos2unix
এই সমস্যাটি স্ট্যান্ডার্ড সরঞ্জামগুলির সাহায্যে সমাধান করা যেতে পারে, তবে flipঅজ্ঞদের পক্ষে যথেষ্ট পরিমাণে ফাঁদ রয়েছে যা আমি আপনাকে সুপারিশ করি যে আপনি কমান্ডটি ইনস্টল করবেন , যা লিখেছেন 20 বছর আগে রাহুল ধেসি, রচয়িতা zoo। এটি ফাইলের ফর্ম্যাটগুলিকে রূপান্তর করার জন্য একটি দুর্দান্ত কাজ করে যখন উদাহরণস্বরূপ, বাইনারি ফাইলগুলির অজানা ধ্বংসকে এড়িয়ে যাওয়া, আপনি যদি দেখেন যে প্রতিটি সিআরএলএফ পরিবর্তনের জন্য আপনি কেবল দৌড়াদৌড়ি করেন তবে কিছুটা সহজ ...
এখনও অবধি পোস্ট হওয়া সমাধানগুলি সমস্যার কিছু অংশ নিয়ে ডস / উইন্ডোজের সিআরএলএফকে ইউনিক্সের এলএফতে রূপান্তরিত করে; তারা যে অংশটি হারিয়েছে তা হ'ল ডস একটি লাইন বিভাজক হিসাবে সিআরএলএফ ব্যবহার করে , যখন ইউনিক্স এলএফকে লাইন টার্মিনেটর হিসাবে ব্যবহার করে । পার্থক্যটি হ'ল কোনও ডস ফাইলের (সাধারণত) ফাইলটিতে শেষ লাইনের পরে কিছুই থাকবে না, যখন ইউনিক্স থাকবে। রূপান্তরটি সঠিকভাবে করতে, আপনাকে সেই চূড়ান্ত এলএফ যুক্ত করতে হবে (যদি না ফাইলটি শূন্য দৈর্ঘ্যের হয়, অর্থাত্ এতে কোনও লাইন থাকে না)। এর জন্য আমার প্রিয় প্রসারণ (ম্যাক-স্টাইলের সিআর-বিচ্ছিন্ন ফাইলগুলি হ্যান্ডেল করার জন্য সামান্য যুক্ত যুক্তি সহ, এবং ইতিমধ্যে ইউনিক্স ফর্ম্যাটে থাকা মোলস্ট ফাইলগুলি নয়) কিছুটা পার্ল:
perl -pe 'if ( s/\r\n?/\n/g ) { $f=1 }; if ( $f || ! $m ) { s/([^\n])\z/$1\n/ }; $m=1' PCfile.txt
নোট করুন যে এটি স্ট্যান্ডআউটে ফাইলের ইউনিক্সাইড সংস্করণ প্রেরণ করে। আপনি যদি কোনও ইউনিক্সাইড সংস্করণ দিয়ে ফাইলটি প্রতিস্থাপন করতে চান তবে পারেলের -iপতাকা যুক্ত করুন।
আপনার যদি ডস 2 ইউনিক্স অ্যাক্সেস না রাখেন তবে এই পৃষ্ঠাটি পড়তে পারেন তবে আপনি এখান থেকে ডস 2 ইউনিক্স.পি অনুলিপি / পেস্ট করতে পারেন ।
#!/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একটি ফিল্টার যা স্টাডিনের কাছ থেকে পড়ে, স্টাডাউটকে লেখেন যদি ফাইলগুলি না দেওয়া হয়।
পিসিআরই দিয়ে সুপার ডুপার সহজ;
স্ক্রিপ্ট হিসাবে, বা $@আপনার ফাইলগুলি প্রতিস্থাপন করুন।
#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@
এটি জায়গায় আপনার ফাইলগুলি ওভাররাইট করবে!
আমি কেবল এটি ব্যাকআপ (সংস্করণ নিয়ন্ত্রণ বা অন্যথায়) দিয়ে করার পরামর্শ দিচ্ছি
--। আমি এই সমাধানটি বেছে নিয়েছি কারণ এটি আমার পক্ষে বুঝতে এবং অভিযোজিত করা সহজ। এফওয়াইআই, স্যুইচগুলি এটি করে: -pএকটি "ইনপুট" লুপ ধরে নিন, -iজায়গায় ইনপুট ফাইল সম্পাদনা করুন, -eনিম্নলিখিত কমান্ডটি সম্পাদন করুন
একটি এমনকি সহজ awk সমাধান ডাব্লু / ওএ প্রোগ্রাম:
awk -v ORS='\r\n' '1' unix.txt > dos.txt
প্রযুক্তিগতভাবে '1' আপনার প্রোগ্রাম, বি / সি 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)।
আকর্ষণীয়ভাবে উইন্ডোতে আমার গিট-ব্যাশে 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
আমার অনুমান যে ইনপুট থেকে লাইনগুলি পড়ার সময় সেড সেগুলি উপেক্ষা করে এবং আউটপুটটিতে সর্বদা ইউনিক্স লাইন এন্ডিংগুলি লেখেন।
এটি আমার পক্ষে কাজ করেছে
tr "\r" "\n" < sampledata.csv > sampledata2.csv
ঠিক একই প্রশ্নটি করা উচিত ছিল (উইন্ডোজ সাইডে, তবে লিনাক্সের ক্ষেত্রেও সমানভাবে প্রযোজ্য zip -ll)
zip -ll textfiles-lf.zip files-with-crlf-eol.*
unzip textfiles-lf.zip
দ্রষ্টব্য: এটি মূল ফাইলের নামগুলি সংরক্ষণ করে তবে লাইন শেষটি এলএফএতে রূপান্তর করে একটি জিপ ফাইল তৈরি করবে। তারপরে unzipফাইলগুলিকে জিপড হিসাবে এক্সট্রাক্ট করতে হবে, এটি তাদের মূল নামগুলির সাথে (তবে এলএফ-এন্ডিং সহ) রয়েছে, যাতে কোনওভাবে যদি স্থানীয় মূল ফাইলগুলি ওভাররাইট করতে অনুরোধ করা হয়।
এর থেকে প্রাসঙ্গিক অংশ zip --help:
zip --help
...
-l convert LF to CR LF (-ll CR LF to LF)
ম্যাক অসক্সের জন্য যদি আপনি হোমব্রু ইনস্টল করেন [ http://brew.sh/ عدال ী 1]
brew install dos2unix
for csv in *.csv; do dos2unix -c mac ${csv}; done;
নিশ্চিত হয়ে নিন যে আপনি ফাইলগুলির অনুলিপি তৈরি করেছেন, কারণ এই আদেশটি ফাইলগুলিকে পরিবর্তিত করবে। -C ম্যাক বিকল্পটি স্যুইচটিকে ওএসএক্সের সাথে সামঞ্জস্যপূর্ণ করে তোলে।
-c mac, যা প্রাক-ওএস এক্স-কেবলমাত্র CRনতুন লাইনে রূপান্তর করার জন্য । আপনি কেবলমাত্র ম্যাক ওএস 9 বা তার আগে ফাইলগুলির জন্য সেই মোডটি ব্যবহার করতে চান।
আপনি awk ব্যবহার করতে পারেন। রেকর্ড বিভাজক ( RS) একটি রেইগ এক্সেপে সেট করুন যা সমস্ত সম্ভাব্য নিউলাইন অক্ষর বা অক্ষরগুলির সাথে মেলে। এবং ORSইউনিক্স-শৈলীর নতুন লাইন অক্ষরে আউটপুট রেকর্ড বিভাজক ( ) সেট করুন ।
awk 'BEGIN{RS="\r|\n|\r\n|\n\r";ORS="\n"}{print}' windows_or_macos.txt > unix.txt
git diffদেখায় , ভিমে সম্পাদিত)
লিনাক্সে ^ এম (সিটিআরএল-এম) কে * এক্স নিউ নিউলাইনস (^ জে) এ সেডের সাথে রূপান্তর করা সহজ।
এটি সিএলআই-তে এরকম কিছু হবে, পাঠ্যে আসলে একটি লাইন ব্রেক হবে। যাইহোক, 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'
যেহেতু প্রশ্নটি শেডের উল্লেখ করেছে, এটি অর্জনের জন্য এটি সবচেয়ে সহজ সরল পথ। অভিব্যক্তি যা বলে তা হ'ল সমস্ত ক্যারেজ-রিটার্ন এবং লাইন-ফিডকে কেবল লাইন-ফিডের সাথে প্রতিস্থাপন করা। উইন্ডোজ থেকে ইউনিক্সে যাওয়ার সময় আপনার যা প্রয়োজন তা হল। আমি যাচাই করেছি এটি কাজ করে।
আমি গৃহীত উত্তরের উপর ভিত্তি করে একটি স্ক্রিপ্ট তৈরি করেছি যাতে আপনি শেষ পর্যন্ত কোনও অতিরিক্ত ফাইলের প্রয়োজন ছাড়াই এবং পরে মুছে ফেলা এবং নাম পরিবর্তন করে সরাসরি এটি রূপান্তর করতে পারেন।
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 $ //' file.txt পাশাপাশি আরও কয়েকটি পদ্ধতিতে চেষ্টা করেছি ( http://www.thingy-ma-jig.co.uk/blog/25-11-2010/fixing- ডস-লাইন-এন্ডিংস বা http://hintsforums.macworld.com/archive/index.php/t-125.html )। কোনওটিই কাজ করেনি, ফাইলটি অপরিবর্তিত রয়েছে (বিটিডব্লিউ Ctrl-v এন্টার পুনরুত্পাদন করতে ^ এম প্রয়োজন হয়েছিল)। শেষ পর্যন্ত আমি টেক্সটরঙ্গলার ব্যবহার করেছি। এটি কঠোরভাবে কমান্ড লাইন নয় তবে এটি কাজ করে এবং এটি অভিযোগ করে না।
dos2unixআপনার প্যাকেজ ম্যানেজার ব্যবহার করে ইনস্টল করুন , এটি সত্যিই অনেক সহজ এবং বেশিরভাগ প্ল্যাটফর্মে রয়েছে।