এক ট্যাব দ্বারা একাধিক স্পেস কীভাবে প্রতিস্থাপন করা যায়


27

আমার কাছে কিছু পাঠ্য ফাইল রয়েছে যার মধ্যে কয়েকটি কলাম বিভিন্ন স্থানের দ্বারা পৃথক করা আছে তবে পরিবর্তে আমার বিভাজক হিসাবে একটি একক ট্যাব দরকার। বাশে করা কি সম্ভব?


দুর্দান্ত ইনপুটটির জন্য ধন্যবাদ, তবে একটি কলামের ভিতরে আমার কিছু একক স্পেস রয়েছে, তাই আমাকে একটি জায়গার ট্যাবিং এড়াতে হবে। এই জন্য দুঃখিত, isinformation।
user_unknown

উত্তর:


31

একাধিক স্পেসের ক্রমকে একটি ট্যাবে রূপান্তর করতে , তবে পৃথক স্পেসটি একা রেখে দিন :

sed 's/ \+ /\t/g' inputfile > outputfile

বেশ কয়েকটি ফাইলের জন্য এটি করতে:

for inputfile in *
do
    sed 's/ \+ /\t/g' "$inputfile" > tmpfile && mv tmpfile "$inputfile"
done

অথবা

for inputfile in *
do
    sed -i.bak 's/ \+ /\t/g' "$inputfile"
done

অথবা

find . -type f -exec sed -i.bak 's/ \+ /\t/g' {} \;

sed: -e expression #1, char 1: unknown command: `.'
অ্যারন ফ্র্যাঙ্ক

@ অ্যারোনফ্র্যাঙ্ক: আপনি কোন আদেশটি ব্যবহার করেছেন? আমার উত্তরের উদাহরণগুলির মধ্যে কোনওটিতেই ত্রুটি হওয়া উচিত নয়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

দুঃখিত, আমার স্পষ্ট করা উচিত ছিল। findনীচে এক।
অ্যারন ফ্র্যাঙ্ক

@ অ্যারোনফ্রেঙ্ক: sedব্যাকআপের সম্প্রসারণের আগে জিএনইউ কোনও স্থান রাখতে পছন্দ করে না। আমি আমার উত্তর সম্পাদনা করেছি। প্রতিবেদনের জন্য ধন্যবাদ।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

7

যদি আপনার চরিত্রটি একাধিক ট্যাব হয় তবে আপনি এটি ব্যবহার করতে পারেন tr -s:

-s, --squeeze-repeats   replace each input sequence of a repeated character
                        that is listed in SET1 with a single occurrence

উদাহরণ স্বরূপ:

my_file.txt | tr -s " "

সমস্ত সাদা স্থান এক হয়ে যাবে।


এটি ওপি যা চাইছে তা নয়।
রন জন

5

আপনি sedএকটি ট্যাব দিয়ে অনেকগুলি স্পেস প্রতিস্থাপন করতে ব্যবহার করতে পারেন :

এক বা একাধিক স্পেসকে একটি ট্যাবের সাথে প্রতিস্থাপনের উদাহরণ:

cat spaced-file | sed 's/ \+/\t/g' > tabbed-file

ওপি বলেছিল যে জায়গাগুলির সংখ্যা পরিবর্তনশীল , তাই আমি মনে করি না যে এই সমাধানটি কার্যকর হবে।
মিকেল

@Mikel। উফ। যে ইশারা জন্য ধন্যবাদ। ভেরিয়েবল স্পেসের সাথে মিলের জন্য পোস্টটি সম্পাদনা করেছি।
IvanGoneKrazy

এখানে সবচেয়ে দরকারী উত্তর।
Luís de Sousa

3

শুধুমাত্র ব্যবহার করে সবচেয়ে সহজ উত্তর bash:

while read -r col1 col2 col3 ...; do
    echo -e "$col1\t$col2\t$col3..."
done <file

যদি কলামের পরিবর্তনশীল সংখ্যা থাকে তবে আপনি এটি করতে পারেন তবে এটি কেবল কাজ করবে bash, না sh:

while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <file

যেমন

while read -r -a cols; do
    (
        IFS=$'\t'
        echo "${cols[*]}"
    )
done <<EOF
a b   c
d   e    f
  g h i
EOF

সৃষ্টি করে:

a   b   c
d   e   f
g   h   i

(প্রত্যেকের মধ্যে একটি ট্যাব রয়েছে তবে আমি এখানে এটি পেস্ট করলে এটি দেখতে পারা শক্ত)

আপনি এটি ব্যবহার করে sedবা করতে পারেন tr, তবে লক্ষ্য করুন যে শুরুর দিকে ফাঁকা হ্যান্ডলিং বিভিন্ন ফলাফল দেয় produces

sed:

$ sed 's/  */\t/g' << EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i

tr:

$ tr -s ' ' '\t' <<EOF
a b   c
d   e    f
  g h i
EOF
a       b       c
d       e       f
        g       h       i


2

নিম্নলিখিত এসইডি স্ক্রিপ্ট চেষ্টা করুন:

 sed 's/  */<TAB>/g' <spaces-file > tabs-file

যেখানে <TAB> টিএব কী টিপছে।


0

এটি একটি খুব সহজ সমাধান:

    sed -E 's/\s+/\t/g' your_file > new_file

সেড মূলত এই পদ্ধতিতে কাজ করে (সেডের / পুরানো_প্যাটার্ন / নতুন_প্যাটার্ন / জি ')। এক্ষেত্রে পুরানো প্যাটার্নটি হ'ল "\ s +" যার অর্থ স্পেস "s" এক বা একাধিক সময় "+" এবং পিছনে স্ল্যাশ "\" সন্ধান করুন এটি নিয়মিত অভিব্যক্তি হিসাবে ব্যাখ্যা করে।
নতুন প্যাটার্নটি হল ট্যাব "\ t" যা নিয়মিত অভিব্যক্তি বিন্যাসে লেখা হয় এবং "জি" সমস্ত লাইনে "বিশ্বব্যাপী" প্রতিস্থাপন প্রয়োগ করে।


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