ইউনিক্সে গাড়ীর রিটার্ন সরান


218

\rইউনিক্সের কোনও ফাইল থেকে সমস্ত গাড়িবহর ফেরত সরানোর সহজ উপায় কী ?


3
আপনি কি '\ r' '\ n', বা কেবল বাজে '\ r' এর কথা বলছেন?
ভি 3

উত্তর:


261

আমি আপনি কি বলতে চান ঘোড়ার গাড়ি আয় (অনুমান করা যাচ্ছে না 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

আপনার বাক্সে যদি এই সরঞ্জামগুলির মধ্যে কোনও ইনস্টল না থাকে তবে আপনি ফাইলগুলি রূপান্তর করার চেষ্টা করার চেয়ে বড় সমস্যা পেয়েছেন :-)


13
\rকেবল জিএনইউ sed `echo "s/\r//"`
সেডের

15
আমরাও sedনা echoচিনতে \rMacOS উপর। এই ক্ষেত্রে শুধুমাত্র printf "\r"কাজ প্রদর্শিত হবে।
স্টিভ পাওয়েল

30
@ স্টিভের মন্তব্যটি বিস্তারিতভাবে বর্ণনা করতে: একটি ম্যাকের জন্য, নিম্নলিখিতটি ব্যবহার করুন: sed "s/$(printf '\r')\$//"
এমকিলেমেন্ট 0

7
Mac এ ফিক্স ইস্যু করতে আপনার কাছে দিয়ে একক উদ্ধৃতি স্ট্রিং sed পূর্বে ভী করতে $যেমন: sed $'s@\r@@g' |od -c (কিন্তু আপনি যদি প্রতিস্থাপন করবে \nআপনি এটা অব্যাহতি প্রয়োজন হবে)
nhed

1
আমি ১০০% নিশ্চিত নই, তবে ওএস এক্স-এর CTRL-V + CTRL-Mজন্য \rদেখে মনে হচ্ছে এটি কাজ করতে পারে।

240
tr -d '\r' < infile > outfile

টিআর দেখুন (1)


4
দুর্দান্ত নয়: 1. স্থানে কাজ করে না, ২ E আর প্রতিস্থাপন করতে পারে EOL তেও নয় (যা আপনি যা চান তা হতে পারে বা নাও পারে ...)।
টমাসজ গ্যান্ডার

10
১. বেশিরভাগ অদ্বিতীয় সরঞ্জামগুলি সেভাবে কাজ করে এবং সাধারণত জিনিসগুলি নিয়ে যাওয়ার সবচেয়ে নিরাপদ উপায় যেহেতু আপনি যদি স্ক্রু আঁকেন তবে আপনার এখনও মূল থাকে। ২. যেমনটি বর্ণিত প্রশ্নটি হ'ল গাড়ীর রিটার্ন অপসারণ করা, লাইন এন্ডিংগুলিকে রূপান্তর করতে নয়। তবে প্রচুর অন্যান্য উত্তর রয়েছে যা আপনাকে আরও ভালভাবে পরিবেশন করতে পারে।
হেনরিক গুস্তাফসন

1
যদি আপনার পালানোর trপক্ষে সমর্থন না করা হয় তবে \rচেষ্টা করুন '\015'বা সম্ভবত একটি আক্ষরিক '^M'(অনেক টার্মিনালের বহু শেলের মধ্যে, ctrl-V ctrl-M একটি আক্ষরিক ctrl-M অক্ষর তৈরি করবে)।
ট্রিপলি

আপনি চান যখন কেউ এটি পরিবর্তন কিভাবে outfile = infile?
ক্রিস্টোফার

3
: @donlan প্রয়াত প্রতিক্রিয়া কিন্তু আপনি সাধারণত ভালো কিছু ব্যবহার someProg <in >out && mv out in
paxdiablo


32

লিনাক্সের সহজতম উপায় হ'ল আমার বিনীত মতে,

sed -i 's/\r$//g' <filename>

শক্তিশালী কোট প্রতিকল্পন অপারেটর প্রায় 's/\r//'হয় অপরিহার্য । তাদের ছাড়া শেলটি \rএকটি পলায়ন + আর হিসাবে ব্যাখ্যা করবে এবং এটিকে একটি সমতলতে হ্রাস করবে rএবং সমস্ত নিম্নতর কেস সরিয়ে দেবে r। এই কারণেই রব দ্বারা উপরোক্ত উত্তরটি 2009 এ কার্যকর হয় না।

এবং /gসংশোধক যুক্ত করা নিশ্চিত করে যে একাধিক \rসরানো হবে, এবং কেবল প্রথমটি নয়।


27

ডস 2 ইউনিক্স নামে একটি ইউটিলিটি রয়েছে যা অনেকগুলি সিস্টেমে বিদ্যমান রয়েছে এবং বেশিরভাগটিতে সহজেই ইনস্টল করা যেতে পারে।


6
কখনও কখনও এটিকে ফডডোস (এবং টডস )ও বলা হয়।
বেনামে

লিংক, এখন নিচে অনুগ্রহ করে পরিদর্শন করুন http://dos2unix.sourceforge.net/ পরিবর্তে
RyanQuey

7

sed -i s/\r// <filename>বা সামসুচ; দেখুন man sedবা ওয়েবে ব্যবহার সম্পর্কিত তথ্য সম্পর্কিত সম্পদ sed

একটি বিষয় উল্লেখ করার জন্য হ'ল উপরের "ক্যারিজ রিটার্ন" এর সুনির্দিষ্ট অর্থ; যদি আপনি সত্যই সিঙ্গল কন্ট্রোল ক্যারেক্টারটিকে "ক্যারেজ রিটার্ন" বলতে চান তবে উপরের প্যাটার্নটি সঠিক is যদি আপনি বোঝাতে চেয়েছিলেন তবে আরও সাধারণভাবে, সিআরএলএফ (ক্যারেজ রিটার্ন এবং একটি লাইন ফিড, যা উইন্ডোজের অধীনে লাইন ফিডগুলি প্রয়োগ করা হয়), তবে আপনি সম্ভবত \r\nপরিবর্তে প্রতিস্থাপন করতে চান । নগ্ন লাইন ফিড (সম্পর্কে newline) লিনাক্স / ইউনিক্স হয় \n


আমি -> সেড এর / \ r \ n / = / 'কান্ট্রি নিউইউ টেক্সট> ডেমো টেক্সট ব্যবহার করার চেষ্টা করছি যা কাজ করে না। "বাঘ" "সিংহ।"
সুভাসিস

আমরা কি আপনাকে ম্যাকের বোঝাতে চাইছি? আমি লক্ষ্য করেছি ডারউইন
শেডের

4
এফওয়াইআই, s/\r//ওএস এক্স-এ ক্যারিয়ারের রিটার্ন সরিয়ে ফেলবে বলে মনে হয় না, এর rপরিবর্তে আক্ষরিক অক্ষর মুছে ফেলা হবে বলে মনে হয় । আমি এখনও নিশ্চিত না কেন এটি এখনও। স্ট্রিংটি উদ্ধৃত হওয়ার সাথে সাথে এর কিছু করার আছে? একটি workaround হিসাবে, CTRL-V + CTRL-Mজায়গায় ব্যবহার করে \rকাজ মনে হয়।

6

আপনি যদি কোনও ভিআই ব্যবহারকারী হন তবে আপনি ফাইলটি খুলতে এবং ক্যারিয়ারের রিটার্নটি সরিয়ে ফেলতে পারেন:

:%s/\r//g

বা সাথে

:1,$ s/^M//

নোট করুন যে আপনার সিআরটিএল-ভি টিপুন এবং তারপরে সিটিআরএল-এম লিখে ^ এম টাইপ করা উচিত।


2
দুর্দান্ত নয়: যদি ফাইলটি প্রতিটি লাইনে সিআর থাকে (যেমন একটি সঠিক ডস ফাইল), ভিম ফাইল ফাইল টাইপ = ডস দিয়ে লোড করবে এবং শো-মোটেও প্রদর্শন করবে না ^M। এটি প্রায় এক টন কীস্ট্রোক, যা ভিমের জন্য তৈরি করা হয় না;)। আমি sed -iEOL এ সিআরএস-এ অপসারণ সীমাবদ্ধ করতে কেবলমাত্র গিয়েছিলাম এবং তারপরে `-e 's / \ r $ // g' চাই।
টমাসজ গ্যান্ডার

6

আরও একবার সমাধান ... কারণ সবসময় আরও একটি আছে:

perl -i -pe 's/\r//' filename

এটি দুর্দান্ত কারণ এটি স্থানে রয়েছে এবং আমি যে ইউনিক্স / লিনাক্সের সাথে কাজ করেছি তার প্রতিটি স্বাদে কাজ করে।


3

অন্য কেউ সুপারিশ করেন dos2unixএবং আমি দৃ strongly়রূপে এটিরও সুপারিশ করি। আমি কেবল আরও বিশদ সরবরাহ করছি।

যদি ইনস্টল করা থাকে তবে পরবর্তী পদক্ষেপে যান। যদি ইতিমধ্যে ইনস্টল না করা থাকে তবে আমি এটির মাধ্যমে এটি ইনস্টল করার পরামর্শ দেব yum:

yum install dos2unix

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

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

2

যদি আপনি এমন কোনও ওএস ব্যবহার করেন (যেমন ওএস এক্স) যার 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অন্যান্য উদাহরণগুলির মতো কমান্ড লাইনে নামটি একইভাবে ব্যবহার করতে সক্ষম হবেন ।


2

এই জিনিসটি এখানে,

%0dক্যারেজ রিটার্ন চরিত্র। এটি ইউনিক্সের সাথে তুলনামূলক করতে। আমাদের নীচের কমান্ডটি ব্যবহার করতে হবে।

dos2unix fileName.extension fileName.extension


1

ডস ফাইলটিকে ইউনিক্স ফাইলে রূপান্তর করার চেষ্টা করুন:

fromdos ফাইল


1

ইউনিক্সের জন্য ... আমি লক্ষ্য করেছি ডস 2 ইউনিক্স সরানো হয়েছে ইউনিকোড শিরোনামগুলি আমার ইউটিএফ -8 ফাইলটি তৈরি করে। গিট ব্যাশ (উইন্ডোজ) এর অধীনে, নিম্নলিখিত স্ক্রিপ্টটি দুর্দান্তভাবে কাজ করছে বলে মনে হচ্ছে। এটি সেড ব্যবহার করে। নোট করুন এটি কেবল লাইনের শেষ প্রান্তে গাড়িবহন-রিটার্নগুলি সরিয়ে দেয় এবং ইউনিকোড শিরোনাম সংরক্ষণ করে।

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

1

আপনি যদি X পরিবেশ চালাচ্ছেন এবং সঠিক সম্পাদক (ভিজ্যুয়াল স্টুডিও কোড) রাখেন তবে আমি পুনঃসংশোধনটি অনুসরণ করব:

ভিজ্যুয়াল স্টুডিও কোড: কীভাবে লাইন শেষ দেখানো যায়

আপনার স্ক্রিনের ঠিক নীচে ডানদিকে যান, ভিজ্যুয়াল স্টুডিও কোড আপনাকে ফাইল এনকোডিং এবং ফাইলের পরে লাইন কনভেনশনের সমাপ্তি উভয়ই দেখায়, কেবলমাত্র একটি সাধারণ ক্লিকের সাহায্যে আপনি এটিকে স্যুইচ করতে পারেন।

একটি লিনাক্স পরিবেশে নোটপ্যাড ++ এর জন্য আপনার প্রতিস্থাপন হিসাবে ভিজ্যুয়াল কোডটি ব্যবহার করুন এবং আপনি যেতে প্রস্তুত।


অথবা আপনার লিনাক্স সিস্টেমে ফাইলটি অনুলিপি করার আগে আপনার উইন্ডোজ সিস্টেমে Notepad++কমান্ডটি ব্যবহার Edit / EOL Conversion / Unix (LF)করুন।
জেসি চিশলম

1

যে \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
% 

0

আমি এর জন্য অজগর ব্যবহার করেছি, আমার কোড এখানে;

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

0

যদিও এটি একটি পুরানো পোস্ট, সম্প্রতি আমি একই সমস্যাটি নিয়ে এসেছি। আমার যেমন / টিএমপি / ব্লাহ_ডির / এর ভিতরে নতুন নামকরণের সমস্ত ফাইল ছিল কারণ এই ডিরেক্টরিতে প্রতিটি ফাইলের "/ 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

দ্রষ্টব্য: আমি যেটা কাজ করেছি তার কাছাকাছি হলেও এই উদাহরণটি খুব সঠিক নয় (কেবলমাত্র আমি কী করেছি সে সম্পর্কে আরও ভাল ধারণা দেওয়ার জন্য এখানে উল্লেখ করছি)


0

আমি এই শেল-স্ক্রিপ্টটি 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

-1

আপনি কেবল এটি করতে পারেন:

$ echo $(cat input) > output

কেন কেউ '-1' দিয়েছে তা জানেন না। এটি পুরোপুরি ভাল উত্তর (এবং একমাত্র আমার পক্ষে কাজ করেছে)।
ফ্র্যাক্টালস্পেস

1
ওহ, দুঃখিত, এটা আমি ছিল। অপেক্ষা করুন, দেখুন, এটি সত্যিই '' r 'এর জন্য কাজ করে না!
ভাইচাস্লাভ রোদিওনোভ

1
@ ফ্র্যাক্টালস্পেস এটি একটি ভয়ানক ধারণা! এটি ফাইলের সমস্ত ব্যবধানকে পুরোপুরি নষ্ট করে দেয় এবং ফাইলের সমস্ত বিষয়বস্তু শেল দ্বারা ব্যাখ্যা করার জন্য ছেড়ে যায়। এটি একটি ফাইলের সাথে চেষ্টা করুন যাতে একটি লাইন থাকে a * b...
টম ফেনেক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.