\r
ইউনিক্সের কোনও ফাইল থেকে সমস্ত গাড়িবহর ফেরত সরানোর সহজ উপায় কী ?
\r
ইউনিক্সের কোনও ফাইল থেকে সমস্ত গাড়িবহর ফেরত সরানোর সহজ উপায় কী ?
উত্তর:
আমি আপনি কি বলতে চান ঘোড়ার গাড়ি আয় (অনুমান করা যাচ্ছে না CR, "\r"
, 0x0d
কোণে) প্রান্ত বরং একটি ফাইল মধ্যে অন্ধ চেয়ে লাইনের (আপনি তাদের সব আমি জানি স্ট্রিং মাঝখানে থাকতে পারে)। এই পরীক্ষার ফাইলটি CRকেবল প্রথম লাইনের শেষে দিয়ে:
$ 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
এটি যদি আপনার সিস্টেমে ইনস্টল করা হয় তবে যাওয়ার উপায়:
$ cat infile | dos2unix -U | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
যদি কোনও কারণে আপনার dos2unix
কাছে না পাওয়া যায় তবে sed
তা করবে:
$ cat infile | sed 's/\r$//' | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
যদি কোনও কারণে আপনার sed
কাছে না পাওয়া যায় তবে ed
জটিল পদ্ধতিতে এটি করুন:
$ 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
আপনার বাক্সে যদি এই সরঞ্জামগুলির মধ্যে কোনও ইনস্টল না থাকে তবে আপনি ফাইলগুলি রূপান্তর করার চেষ্টা করার চেয়ে বড় সমস্যা পেয়েছেন :-)
\r
কেবল জিএনইউ sed `echo "s/\r//"`
sed
না echo
চিনতে \r
MacOS উপর। এই ক্ষেত্রে শুধুমাত্র printf "\r"
কাজ প্রদর্শিত হবে।
sed "s/$(printf '\r')\$//"
$
যেমন: sed $'s@\r@@g' |od -c
(কিন্তু আপনি যদি প্রতিস্থাপন করবে \n
আপনি এটা অব্যাহতি প্রয়োজন হবে)
tr
পক্ষে সমর্থন না করা হয় তবে \r
চেষ্টা করুন '\015'
বা সম্ভবত একটি আক্ষরিক '^M'
(অনেক টার্মিনালের বহু শেলের মধ্যে, ctrl-V ctrl-M একটি আক্ষরিক ctrl-M অক্ষর তৈরি করবে)।
outfile = infile
?
someProg <in >out && mv out in
।
লিনাক্সের সহজতম উপায় হ'ল আমার বিনীত মতে,
sed -i 's/\r$//g' <filename>
শক্তিশালী কোট প্রতিকল্পন অপারেটর প্রায় 's/\r//'
হয় অপরিহার্য । তাদের ছাড়া শেলটি \r
একটি পলায়ন + আর হিসাবে ব্যাখ্যা করবে এবং এটিকে একটি সমতলতে হ্রাস করবে r
এবং সমস্ত নিম্নতর কেস সরিয়ে দেবে r
। এই কারণেই রব দ্বারা উপরোক্ত উত্তরটি 2009 এ কার্যকর হয় না।
এবং /g
সংশোধক যুক্ত করা নিশ্চিত করে যে একাধিক \r
সরানো হবে, এবং কেবল প্রথমটি নয়।
ডস 2 ইউনিক্স নামে একটি ইউটিলিটি রয়েছে যা অনেকগুলি সিস্টেমে বিদ্যমান রয়েছে এবং বেশিরভাগটিতে সহজেই ইনস্টল করা যেতে পারে।
sed -i s/\r// <filename>
বা সামসুচ; দেখুন man sed
বা ওয়েবে ব্যবহার সম্পর্কিত তথ্য সম্পর্কিত সম্পদ sed
।
একটি বিষয় উল্লেখ করার জন্য হ'ল উপরের "ক্যারিজ রিটার্ন" এর সুনির্দিষ্ট অর্থ; যদি আপনি সত্যই সিঙ্গল কন্ট্রোল ক্যারেক্টারটিকে "ক্যারেজ রিটার্ন" বলতে চান তবে উপরের প্যাটার্নটি সঠিক is যদি আপনি বোঝাতে চেয়েছিলেন তবে আরও সাধারণভাবে, সিআরএলএফ (ক্যারেজ রিটার্ন এবং একটি লাইন ফিড, যা উইন্ডোজের অধীনে লাইন ফিডগুলি প্রয়োগ করা হয়), তবে আপনি সম্ভবত \r\n
পরিবর্তে প্রতিস্থাপন করতে চান । নগ্ন লাইন ফিড (সম্পর্কে newline) লিনাক্স / ইউনিক্স হয় \n
।
আপনি যদি কোনও ভিআই ব্যবহারকারী হন তবে আপনি ফাইলটি খুলতে এবং ক্যারিয়ারের রিটার্নটি সরিয়ে ফেলতে পারেন:
:%s/\r//g
বা সাথে
:1,$ s/^M//
নোট করুন যে আপনার সিআরটিএল-ভি টিপুন এবং তারপরে সিটিআরএল-এম লিখে ^ এম টাইপ করা উচিত।
^M
। এটি প্রায় এক টন কীস্ট্রোক, যা ভিমের জন্য তৈরি করা হয় না;)। আমি sed -i
EOL এ সিআরএস-এ অপসারণ সীমাবদ্ধ করতে কেবলমাত্র গিয়েছিলাম এবং তারপরে `-e 's / \ r $ // g' চাই।
আরও একবার সমাধান ... কারণ সবসময় আরও একটি আছে:
perl -i -pe 's/\r//' filename
এটি দুর্দান্ত কারণ এটি স্থানে রয়েছে এবং আমি যে ইউনিক্স / লিনাক্সের সাথে কাজ করেছি তার প্রতিটি স্বাদে কাজ করে।
অন্য কেউ সুপারিশ করেন dos2unix
এবং আমি দৃ strongly়রূপে এটিরও সুপারিশ করি। আমি কেবল আরও বিশদ সরবরাহ করছি।
যদি ইনস্টল করা থাকে তবে পরবর্তী পদক্ষেপে যান। যদি ইতিমধ্যে ইনস্টল না করা থাকে তবে আমি এটির মাধ্যমে এটি ইনস্টল করার পরামর্শ দেব yum
:
yum install dos2unix
তারপরে আপনি এটি ব্যবহার করতে পারেন:
dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
যদি আপনি এমন কোনও ওএস ব্যবহার করেন (যেমন ওএস এক্স) যার dos2unix
কমান্ড নেই তবে এতে পাইথন ইন্টারপ্রেটার (সংস্করণ 2.5+) রয়েছে তবে এই কমান্ডটি এই আদেশটির সমতুল্য dos2unix
:
python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"
এটি কমান্ড লাইনের নামকৃত দুটি ফাইল পাশাপাশি পাইপ এবং পুনর্নির্দেশগুলি হ্যান্ডল করে dos2unix
। যদি আপনি এই লাইনটি আপনার ~ / .bashrc ফাইলটিতে যুক্ত করেন (বা অন্যান্য শেলের জন্য সমতুল্য প্রোফাইল ফাইল):
alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""
... পরের বার যখন আপনি লগ ইন করবেন (বা source ~/.bashrc
বর্তমান অধিবেশন চালাবেন ) আপনি dos2unix
অন্যান্য উদাহরণগুলির মতো কমান্ড লাইনে নামটি একইভাবে ব্যবহার করতে সক্ষম হবেন ।
এই জিনিসটি এখানে,
%0d
ক্যারেজ রিটার্ন চরিত্র। এটি ইউনিক্সের সাথে তুলনামূলক করতে। আমাদের নীচের কমান্ডটি ব্যবহার করতে হবে।
dos2unix fileName.extension fileName.extension
ইউনিক্সের জন্য ... আমি লক্ষ্য করেছি ডস 2 ইউনিক্স সরানো হয়েছে ইউনিকোড শিরোনামগুলি আমার ইউটিএফ -8 ফাইলটি তৈরি করে। গিট ব্যাশ (উইন্ডোজ) এর অধীনে, নিম্নলিখিত স্ক্রিপ্টটি দুর্দান্তভাবে কাজ করছে বলে মনে হচ্ছে। এটি সেড ব্যবহার করে। নোট করুন এটি কেবল লাইনের শেষ প্রান্তে গাড়িবহন-রিটার্নগুলি সরিয়ে দেয় এবং ইউনিকোড শিরোনাম সংরক্ষণ করে।
#!/bin/bash
inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"
আপনি যদি X পরিবেশ চালাচ্ছেন এবং সঠিক সম্পাদক (ভিজ্যুয়াল স্টুডিও কোড) রাখেন তবে আমি পুনঃসংশোধনটি অনুসরণ করব:
ভিজ্যুয়াল স্টুডিও কোড: কীভাবে লাইন শেষ দেখানো যায়
আপনার স্ক্রিনের ঠিক নীচে ডানদিকে যান, ভিজ্যুয়াল স্টুডিও কোড আপনাকে ফাইল এনকোডিং এবং ফাইলের পরে লাইন কনভেনশনের সমাপ্তি উভয়ই দেখায়, কেবলমাত্র একটি সাধারণ ক্লিকের সাহায্যে আপনি এটিকে স্যুইচ করতে পারেন।
একটি লিনাক্স পরিবেশে নোটপ্যাড ++ এর জন্য আপনার প্রতিস্থাপন হিসাবে ভিজ্যুয়াল কোডটি ব্যবহার করুন এবং আপনি যেতে প্রস্তুত।
Notepad++
কমান্ডটি ব্যবহার Edit / EOL Conversion / Unix (LF)
করুন।
\r
কোনও UNIX® সিস্টেমে সরানো হচ্ছে:এই প্রশ্নের বেশিরভাগ বিদ্যমান সমাধানগুলি জিএনইউ-নির্দিষ্ট, এবং ওএস এক্স বা বিএসডি তে কাজ করবে না; নীচের সমাধানগুলি কোনো শেল আরো অনেক UNIX সিস্টেমের ক্ষেত্রে কাজ করা উচিত, এবং, থেকে tcsh
থেকে sh
, এখনো এখনও খুব, জিএনইউ / লিনাক্স এমনকি কাজ করি।
ওএস এক্স, ওপেনবিএসডি এবং নেটবিএসডি ইন tcsh
এবং ডেবিয়ান জিএনইউ / লিনাক্স ইন পরীক্ষা করা হয়েছে bash
।
sed
:ইন tcsh
একটি OS X এর উপর, নিম্নলিখিত sed
স্নিপেট একসঙ্গে সঙ্গে ব্যবহার করা যেতে পারে printf
, যেমন তন্ন তন্ন sed
না echo
হ্যান্ডল \r
গনুহ মত বিশেষ পদ্ধতিতে কাজ করে:
sed `printf 's/\r$//g'` input > output
tr
:আরেকটি বিকল্প হ'ল tr
:
tr -d '\r' < input > output
sed
এবং এর মধ্যে পার্থক্য tr
:এটি প্রদর্শিত হবে যে tr
ইনপুট ফাইলটি থেকে পিছনে থাকা নতুন লাইনের অভাব রক্ষা করে, যেখানে sed
ওএস এক্স এবং নেটবিএসডি (তবে ওপেনবিএসডি বা জিএনইউ / লিনাক্সে নয়) ফাইলের একেবারে শেষের দিকে একটি ট্রেলিং নিউলাইন সন্নিবেশ করে এমনকি ইনপুটটি কোনও অনুপস্থিত থাকলেও পিছনে \r
বা \n
ফাইলের একেবারে শেষে।
এখানে কিছু নমুনা পরীক্ষার ব্যবস্থা রয়েছে যা এটি আপনার সিস্টেমে কাজ করে printf
এবং এটি ব্যবহার করে তা নিশ্চিত করতে ব্যবহার করা যেতে পারে hexdump -C
; বিকল্পভাবে, od -c
আপনার সিস্টেমটি অনুপস্থিত থাকলে এটিও ব্যবহার করা যেতে পারে 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
%
যদিও এটি একটি পুরানো পোস্ট, সম্প্রতি আমি একই সমস্যাটি নিয়ে এসেছি। আমার যেমন / টিএমপি / ব্লাহ_ডির / এর ভিতরে নতুন নামকরণের সমস্ত ফাইল ছিল কারণ এই ডিরেক্টরিতে প্রতিটি ফাইলের "/ r" অনুচ্ছেদে অক্ষর ছিল (ফাইলের শেষে "দেখানো"? "), সুতরাং এটি স্ক্রিপ্টের পদ্ধতিতে করা কেবল আমিই ভাবতে পারি।
আমি একই নামে চূড়ান্ত ফাইলটি সংরক্ষণ করতে চেয়েছিলাম (কোনও চরিত্রের পিছনে ছাড়াই)। সেডের সাথে সমস্যা ছিল আউটপুট ফাইলের নাম যা আমার অন্য কিছু উল্লেখ করার প্রয়োজন ছিল (যা আমি চাইনি)।
আমি এখানে প্রস্তাবিত অন্যান্য বিকল্পগুলি চেষ্টা করেছি (কিছু সীমাবদ্ধতার কারণে ডস 2 ইউনিক্স হিসাবে বিবেচনা করা হয়নি) তবে কার্যকর হয়নি।
আমি "awk" দিয়ে অবশেষে চেষ্টা করেছি যা কাজ করেছিল যেখানে আমি "\ r" ডিলিমিটার হিসাবে ব্যবহার করেছি এবং প্রথম অংশ নিয়েছি :
কৌশলটি হ'ল:
echo ${filename}|awk -F"\r" '{print $1}'
স্ক্রিপ্ট স্নিপেটের নীচে আমি ব্যবহার করেছি (যেখানে আমার সমস্ত ফাইলের "/" r "পথ / tmp / blah_dir / এ অনুমানযোগ্য চরিত্র হিসাবে ছিল) আমার সমস্যাটি সমাধান করার জন্য:
cd /tmp/blah_dir/
for i in `ls`
do
mv $i $(echo $i | awk -F"\r" '{print $1}')
done
দ্রষ্টব্য: আমি যেটা কাজ করেছি তার কাছাকাছি হলেও এই উদাহরণটি খুব সঠিক নয় (কেবলমাত্র আমি কী করেছি সে সম্পর্কে আরও ভাল ধারণা দেওয়ার জন্য এখানে উল্লেখ করছি)
আমি এই শেল-স্ক্রিপ্টটি character 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
আপনি কেবল এটি করতে পারেন:
$ echo $(cat input) > output
a * b
...