linux - কিভাবে একটি বাশ স্ক্রিপ্টে ডোএস/উইন্ডোজ নতুন লাইন(সিআরএলএফ) কে ইউনিক্স নতুন লাইনে রূপান্তর করবেন?




windows bash (16)

কিভাবে আমি প্রোগ্রাম্যাটিকভাবে (অর্থাৎ, vi ব্যবহার করে না) ইউনিক্সে ডোএস / উইন্ডোজ নতুন লাইন রূপান্তর করতে পারি?

dos2unix এবং unix2dos কমান্ড নির্দিষ্ট সিস্টেমে উপলব্ধ নয়। কিভাবে আমি sed / awk / tr মত কমান্ডের সাথে এই অনুকরণ করতে পারেন?


AWK ব্যবহার করে আপনি করতে পারেন:

awk '{ sub("\r$", ""); print }' dos.txt > unix.txt

পার্ল ব্যবহার করে আপনি করতে পারেন:

perl -pe 's/\r$//' < dos.txt > unix.txt

PCRE সঙ্গে সুপার duper সহজ;

একটি স্ক্রিপ্ট হিসাবে, অথবা আপনার ফাইলগুলির সাথে [email protected] প্রতিস্থাপন করুন।

#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- [email protected]

এই জায়গায় আপনার ফাইল overwrite হবে!

আমি শুধুমাত্র একটি ব্যাকআপ সঙ্গে এই কাজ (সংস্করণ নিয়ন্ত্রণ বা অন্যথায়)


TIMTOWTDI!

perl -pe 's/\r\n/\n/; s/([^\n])\z/$1\n/ if eof' PCfile.txt

@ গর্ডন ডেভিসনের উপর ভিত্তি করে

এক [noeol] সম্ভাবনার [noeol] সম্ভাবনা বিবেচনা করা আবশ্যক ...


আপনি DOS থেকে ইউনিক্স রূপান্তর করতে tr ব্যবহার করতে পারেন; যাইহোক, যদি আপনি সিআরএলএফ বাইট জোয়ারের প্রথম বাইট হিসাবে আপনার ফাইলে সিআর উপস্থিত হন তবে আপনি কেবল এটি নিরাপদে করতে পারেন। এটি সাধারণত ক্ষেত্রে। আপনি তারপর ব্যবহার করুন:

tr -d '\015' <DOS-file >UNIX-file

উল্লেখ্য যে DOS-file নামটি UNIX-file নাম থেকে ভিন্ন; যদি আপনি একই নামের দুবার ব্যবহার করার চেষ্টা করেন তবে আপনি ফাইলটিতে কোন ডেটা শেষ করবেন না।

আপনি এটি অন্য রাউন্ড (মান 'ট্র' দিয়ে) করতে পারবেন না।

আপনি যদি কোন স্ক্রিপ্টে ক্যারিয়ার রিটার্ন প্রবেশ করতে জানেন ( নিয়ন্ত্রণ-ভি , কন্ট্রোল-এম নিয়ন্ত্রণ-এম এ প্রবেশ করতে), তখন:

sed 's/^M$//'     # DOS to Unix
sed 's/$/^M/'     # Unix to DOS

যেখানে '^ এম' কন্ট্রোল-এম চরিত্র। আপনি ক্যারেজ রিটার্ন নির্দিষ্ট করতে bash এএনএসআই-সি কোটিং পদ্ধতি ব্যবহার করতে পারেন:

sed $'s/\r$//'     # DOS to Unix
sed $'s/$/\r/'     # Unix to DOS

যাইহোক, যদি আপনি এটি প্রায়শই করতে যাচ্ছেন (প্রায় একবার, মোটামুটি বলছেন), রূপান্তর প্রোগ্রামগুলি ইনস্টল করার জন্য এটি আরও বেশি বুদ্ধিমান (উদাহরণস্বরূপ dos2unix এবং unix2dos , অথবা সম্ভবত dtou এবং utod ) এবং তাদের ব্যবহার করুন।


আপনি option -c {command} বিকল্পটি দিয়ে প্রোগ্রামটি ব্যবহার করতে পারেন:

ইউনিক্স থেকে ডস:

vim file.txt -c "set ff=unix" -c ":wq"

ইউনিক্স থেকে ডোজ:

vim file.txt -c "set ff=dos" -c ":wq"

"ff = unix / dos সেট করুন" মানে ফাইলের পরিবর্তন ফাইলফরম্যাট (ff) থেকে লাইন ফর্ম্যাটের ইউনিক্স / ডস শেষ হয়

": wq" মানে ডিস্কে ফাইল লিখুন এবং সম্পাদককে ছেড়ে দিন (একটি লুপে কমান্ড ব্যবহার করার অনুমতি দেওয়া হচ্ছে)


আপনি যদি 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))

superuser থেকে ক্রস পোস্ট।


আমি গৃহীত উত্তরের উপর ভিত্তি করে একটি স্ক্রিপ্ট তৈরি করেছি যাতে আপনি শেষে একটি অতিরিক্ত ফাইলের প্রয়োজন ছাড়াই এটি সরাসরি রূপান্তর করতে পারেন এবং পরে মুছে ফেলতে এবং পুনরায় নামকরণ করতে পারেন।

convert-crlf-to-lf() {
    file="$1"
    tr -d '\015' <"$file" >"$file"2
    rm -rf "$file"
    mv "$file"2 "$file"
}

"file1.txt" ফাইলটি যেমন "file1.txt2" ইতিমধ্যে বিদ্যমান নেই বা এটি মুছে ফেলা হবে কিনা তা নিশ্চিত করুন, আমি ফাইলটি সংরক্ষণ করার জন্য এটি একটি অস্থায়ী জায়গা হিসাবে ব্যবহার করি।


উইন্ডোজ sed "" উপর আমার git-bash মধ্যে আকর্ষণীয়ভাবে 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 তাদের উপেক্ষা করে এবং সর্বদা আউটপুট ইউনিক্স লাইন শেষ লিখেছেন।


একটি এমনকি সহজ 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

এটা আমার জন্য কাজ করেছে

tr "\r" "\n" < sampledata.csv > sampledata2.csv 

জায়গায় একটি ফাইল রূপান্তর করতে

dos2unix <filename>

একটি ভিন্ন ফাইল রূপান্তর টেক্সট আউটপুট করতে

dos2unix -n <input-file> <output-file>

এটি ইতিমধ্যে উবুন্টুতে ইনস্টল করা হয়েছে এবং brew install dos2unix দিয়ে homebrew এ উপলব্ধ

আমি এই ইউটিলিটির বিকল্পগুলির জন্য স্পষ্টভাবে জিজ্ঞাসা করি প্রশ্নটি জানি কিন্তু "ইউনিক্স লাইন শেষ করতে রূপান্তর করুন" এর জন্য এটি প্রথম গুগল অনুসন্ধান ফলাফল।


প্রচুর পরিমাণে awk / sed / ইত্যাদি উত্তর রয়েছে যাতে একটি সম্পূরক হিসাবে (এই সমস্যাটির জন্য শীর্ষ অনুসন্ধান ফলাফলগুলির মধ্যে একটি হল):

আপনি dos2unix থাকতে পারে না কিন্তু আপনার আইকন আছে?

iconv -f UTF-16LE -t UTF-8 [filename.txt]
-f from format type
-t to format type

অথবা একটি ডিরেক্টরির মধ্যে সব ফাইল:

find . -name "*.sql" -exec iconv -f UTF-16LE -t UTF-8 {} -o ./{} \;

এটি বর্তমান কমান্ডের সকল .sql ফাইলগুলিতে একই কমান্ড চালায়। -o হল আউটপুট ডিরেক্টরি যাতে আপনি এটি বর্তমান ফাইলগুলি প্রতিস্থাপন করতে পারেন, অথবা নিরাপত্তার / ব্যাকআপ কারণে, পৃথক ডিরেক্টরিতে আউটপুট।


লিনাক্সে ^ এম (ctrl-m) থেকে * নিক্স নিউলাইনস (^ জে) কে সিডি দিয়ে রূপান্তর করা সহজ।

এটি CLI এ এরকম কিছু করবে, আসলে পাঠ্যটিতে একটি লাইন বিরতি থাকবে। যাইহোক, \ পাস যে পাশাপাশি জে পাশাপাশি:

sed 's/^M/\
/g' < ffmpeg.log > new.log

আপনি টাইপ করার সময় ^ V (ctrl-V), ^ এম (ctrl-m) এবং \ (ব্যাকস্ল্যাশ) ব্যবহার করে এটি পেতে পারেন:

sed 's/^V^M/\^V^J/g' < ffmpeg.log > new.log

শুধুমাত্র একই প্রশ্নটি বিবেচনা করতে হবে (উইন্ডোজ-সাইডে, তবে লিনাক্সেও একইভাবে প্রযোজ্য।) সুপারিশ করে কেউ কেউ সিআরএলএফ-কে - -> পুরানো zip -ll বিকল্পটি ব্যবহার করে পাঠ্য-ফাইলগুলির জন্য LF রূপান্তরটি করার খুব বেশি স্বয়ংক্রিয় উপায় উল্লেখ করেনি (তথ্য- জিপ):

zip -ll textfiles-lf.zip files-with-crlf-eol.*
unzip textfiles-lf.zip 

দ্রষ্টব্য: এটি মূল ফাইল নামগুলি সংরক্ষণের একটি জিপ ফাইল তৈরি করবে তবে লাইনের শেষগুলি LF রূপান্তর করবে। তারপর ziped হিসাবে ফাইলগুলি unzip হবে, যা তাদের আসল নামগুলির সাথে (কিন্তু এলএফ-শেষের সাথে) রয়েছে, এইভাবে স্থানীয় মূল ফাইলগুলি যদি কোন থাকে তবে সেটির উপরে ওভাররাইট করার অনুরোধ করে।

zip --help থেকে প্রাসঙ্গিক উদ্ধৃতি zip --help :

zip --help
...
-l   convert LF to CR LF (-ll CR LF to LF)

sed --expression='s/\r\n/\n/g'

যেহেতু প্রশ্ন উল্লেখ করা হয়েছে, এটি এই অর্জনের জন্য sed ব্যবহার করার সবচেয়ে সোজা উপায়। এক্সপ্রেশনটি কেবলমাত্র লাইন-ফিডের মাধ্যমে সমস্ত ক্যারেজ-রিটার্ন এবং লাইন-ফিড প্রতিস্থাপন করে। আপনি উইন্ডোজ থেকে ইউনিক্স এ যান যখন আপনি প্রয়োজন। আমি এটা কাজ যাচাই।


tr -d "\r" < file

sed ব্যবহার করে sed here দেখুন:

# 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





newline