ট্যাবগুলির সহজ সেড প্রতিস্থাপন রহস্যজনকভাবে ব্যর্থ


43

এটি সত্যই সহজ হওয়া উচিত, তবে কোনও কারণে এটি কাজ করছে না:

sed -i.bak -E 's/\t/  /' file.txt

ট্যাব অক্ষরগুলি প্রতিস্থাপনের পরিবর্তে এটি tঅক্ষরগুলি প্রতিস্থাপন করছে । আমি এগুলি নিয়ে ভাবতে পারার প্রতিটি প্রকারের চেষ্টা করেছি, উদ্ধৃতি দিয়ে খেলছি ইত্যাদি G আমি গুগলড করেছি এবং অন্য সকলকে দেখতে পেয়েছি একইরকম অভিব্যক্তি ব্যবহার করেছি এবং তারা তাদের জন্য কাজ করে বলে মনে হচ্ছে।

-Eএকটি OS X এর জিনিস। আমি ভেবেছিলাম ব্যর্থতা ওএস এক্স এর কিছু অদ্ভুত স্ফূতির ফলাফল হতে পারে sed, তাই আমি এটি রুবি (এটি ছাড়া -i) দিয়েও চেষ্টা করেছি এবং একই ফলাফল পেয়েছি:

ruby -pe '$_.gsub!(/\t/,"  ")' < file.txt > file.new

আমি ওএস এক্স এবং আইটিআরমে ব্যাশ ৩.২.৫১ ব্যবহার করছি, যদিও এর মধ্যে কোনওটি কীভাবে ভয়াবহভাবে প্রাসঙ্গিক হতে পারে তা আমি দেখতে পাচ্ছি না। আমি কোনও অদ্ভুত পরিবেশের ভেরিয়েবল সেট করি নি, যদিও আপনি যেটিকে প্রাসঙ্গিক বলে মনে করেন তা পোস্ট করতে পারি।

ভুল হতে পারে?

আপডেট : আমি অন্য কিছু ভুল করেছি আবশ্যক করেছেন অথবা টাইপো যখন আমি রুবি সংস্করণ চেষ্টা করেছি, যেহেতু গিলেজ তুলে ধরে এটি আছে কাজ (এবং আমি করেছি না ছিল তাকে আমাকে ভুল বাহা!)। আমি নিশ্চিত যে ঘটনাটি ঘটেনি, তবে আমি নিশ্চিত যে এটি আমার ভুল হয়েছে।


5
হতে আপনি প্রতিস্থাপন করতে চেষ্টা করা উচিত \tমধ্যে sedদিয়ে বিবৃতি CTRL-V<TAB>যেখানে <TAB>ট্যাব কী এবং CTRL-Vনিয়ন্ত্রণ কী এবং vএকসঙ্গে চাপা।
আনটনাট

যদি রুবিও যদি ভুল উত্তর পেয়ে থাকে তবে এটি আপনার রিজেক্সপ লাইব্রেরি হতে পারে। (আমি আপনার কমান্ড উভয়ই পরীক্ষা করে দেখেছি এবং উভয়ই দুটি স্পেস দিয়ে ট্যাব প্রতিস্থাপন করেছি)) সুতরাং আশা করি আপনি যদি গ্নু সেড ইনস্টল করেন তবে এটি সঠিক লাইব্রেরিও ইনস্টল করবে।
ctrl-alt-delor

উত্তর:


64

সেডে \tএকটি ট্যাব অক্ষরের জন্য বাক্য গঠন মানক নয় not এই পলায়ন একটি জিএনইউ সেড এক্সটেনশন । আপনি অনলাইনে প্রচুর উদাহরণ খুঁজে পান যা এটি ব্যবহার করে কারণ প্রচুর লোক জিএনইউ সেড ব্যবহার করে (এটি এম্বেডড লিনাক্সের উপর সেড বাস্তবায়ন)। তবে ওএস এক্স সেড , অন্যান্য * বিএসডি সেডের মতো \tট্যাব সমর্থন করে না এবং এর পরিবর্তে \tঅর্থ ব্যাকস্ল্যাশ হিসাবে আচরণ করে t

অনেকগুলি সমাধান রয়েছে যেমন:

  • আক্ষরিক ট্যাব অক্ষর ব্যবহার করুন।

    sed -i.bak 's/  /  /' file.txt
    
  • ট্যাব চরিত্রটি ব্যবহার করতে trবা printfতৈরি করতে।

    sed -i.bak "s/$(printf '\t')/  /" file.txt
    sed -i.bak "s/$(echo a | tr 'a' '\t')/  /" file.txt
    
  • ব্যাকস্ল্যাশ পলায়নের জন্য বাশের স্ট্রিং সিনট্যাক্স ব্যবহার করুন ।

    sed -i.bak $'s/\t/  /' file.txt
    
  • পার্ল, পাইথন বা রুবি ব্যবহার করুন। আপনার পোস্ট করা রুবি স্নিপেট কাজ করে।


কোনও ...sedস্ক্রিপ্টে থাকা সেড স্ক্রিপ্টগুলির জন্য ( -fবিকল্পের মাধ্যমে ব্যবহৃত ), আক্ষরিক ট্যাব অক্ষরগুলি আমার কাছে একমাত্র সম্ভাবনা বলে মনে হয়। এটি যখন ভিমের সাথে সম্পাদনা করা হয় তখন set noexpandtabগুরুত্বপূর্ণ।
টোবিয়াস

সতর্কতা: কেবলমাত্র সেই "আক্ষরিক ট্যাব চরিত্র" কৌশলটি ব্যবহার করুন যদি আপনি চান যদি আপনার সহকর্মী আপনার পিছনে ফিরে আসে এবং পরে আপনার স্ক্রিপ্টটি ভেঙে দেয়। trযখন আপনি আপনার সহকর্মী আপনার স্ক্রিপ্টটি পড়েন তখন আপনাকে মুখে ছুরিকাঘাত করতে চান কেবল সেই কৌশলটি ব্যবহার করুন ।
ব্রুনো ব্রোনোস্কি

কোডের দ্বিতীয় ব্লকে দ্বিতীয় ডাবল-কোটেশন চিহ্নটি ভুল জায়গায় রাখা হয়েছে? আমাকে এটিকে সেখানে সরিয়ে নিয়ে যেতে হয়েছিল যেখানে বর্তমানে সমাপ্ত একক উদ্ধৃতি রয়েছে।
এলেন স্পারটাস

বাশ স্ট্রিং সিনট্যাক্সের লিঙ্কটির জন্য ধন্যবাদ ... আমার কোনও ধারণা ছিল না (এবং এটি সেরা বিকল্প, আইএমএইচও)।
লেভিগ্রোকার

sed $'s/<regex>/\t/' file.txtসন্নিবেশের জন্য কাজ করে, তবে $আমার স্ক্রিপ্টটি ভেঙে যায় বলে মনে হয় যখন আমি আমার প্রতিস্থাপনে রেজেক্সের কিছু অংশ অন্তর্ভুক্ত করার চেষ্টা করি, অর্থাৎ sed $'s,\(ontology/[0-9]\+\),\t\txxx\1xxx\t\t,'আমার প্রত্যাশিত ম্যাচের মানটি match by দ্বারা প্রতিস্থাপিত করে `xxxxxx gives দেয়` \1বাশের স্ট্রিং সিনট্যাক্স ব্যবহার করার সময় কি এর সমতুল্য রয়েছে ? সম্পাদনা করুন: xxx <ইউ + 231 সি> এক্সএক্সএক্সএক্সের মাঝখানে ইউ + 231 সি ইউনিকোড চরিত্রের কথা রয়েছে।
জোশ

14

বাশের নির্দিষ্ট নির্দিষ্ট উদ্ধৃতি ব্যবহার করুন যা আপনাকে সি এর মতো স্ট্রিং ব্যবহার করতে দেয়, যাতে একটি আসল ট্যাব অক্ষর পাল্টে যায়, একটি পালানোর ক্রম নয়:

sed -i.bak -E $'s/\t/  /' file.txt

1
অন্যরা এটি সম্পর্কে আরও তথ্য সন্ধান করতে চান কিনা তা উদ্ধৃত করে "এএনএসআই-সি" বলা হয়।
উইসবাকি

2
যে কোনও বোর্ন শেলটি নিয়ে কাজ করার জন্য মনে হচ্ছে, নন-ব্যাশ ইউনিক্সেও কাজ করে। যদিও সিএস-ভেরিয়েন্টে কাজ করে না।
জর্নেনে

1

যেমন উল্লেখ করা হয়েছে, সমস্ত sedবাস্তবায়ন \tঅনুভূমিক ট্যাব হিসাবে চিহ্নিতকরণকে সমর্থন করে না ।

আপনি সহজেই এর সাথে আপনার প্রতিস্থাপন অর্জন করতে পারেন:

 perl -pi.old -e 's{\t+}{ }g' file.txt

এটি সিটু রিপ্ল্যাক্টমেন্টে কাজ করে যা আপনার মূল ফাইলটিকে "* .old" হিসাবে সংরক্ষণ করে। পার্ল ক্ল্যাসিক /তৈরির জন্য বিকল্প ডিলিমিটারদের এক্সপ্রেশনটিকে আরও বেশি পঠনযোগ্য করে তোলে (অর্থাত "ঝুঁকির টুথপিক" সিনড্রোম থেকে বঞ্চিত)।

+বলেছেন একটি ট্যাব অক্ষর এক বা একাধিক পুনরাবৃত্তির প্রতিস্থাপন করা হয়। gপরিবর্তক প্রতিটি লাইনের শেষে সর্বত্র বৈশ্বিক প্রতিস্থাপন দেয়।


1
sed -i $'s/\t/  /g' file.txt 

ওএস এক্সে আমার জন্য কাজ করে এবং লিনাক্সে আমি সমস্ত সময় একই কমান্ড ব্যবহার করি।


নোট করুন যে এটি প্রতিটি সারিতে থাকা সমস্ত ট্যাবকে প্রতিস্থাপন করে যেখানে ওপি কেবল প্রথমটি প্রতিস্থাপন করতে চায় (তারা যে কমান্ডটি ব্যবহার করে তা বিচার করে)।
Kusalananda

0

আপনি echoভিতরে ব্যবহার করতে পারেন sed:

sed -i "s/$(echo '\t')//g"


মনে রাখবেন যে কিছু শেলের বাস্তবায়নে echo '\t'কেবল আউটপুট আসবে । \techo
কুসালানন্দ

0

আপনি যদি ওএস এক্সের চেয়ে আরও শক্তিশালী sed(সমর্থনকারী \tএবং আরও কিছু) চান তবে জিএনইউ সেড ইনস্টল করুন ।


যেহেতু এটি রুবির সাথেও কাজ করেনি, তাই আমি নিশ্চিত নই যে কেন আমি এই সিদ্ধান্তে নেব যে ওএস এক্স এর sedসমস্যা is সমস্যাটি বিশ্বাস করার কোনও কারণ আছে কি? আমি জিএনইউ সিড ইনস্টল করে খুশি হব যদি বিশ্বাস করার কারণ ছিল যে এটি সমস্যার সমাধান করবে তবে আমি মনে করি যে আমি এটির অনেকটা রায় দিয়েছি।
আইকনোক্লাস্ট

রুবি দিয়ে, আপনাকে কেবল একটি ব্যাকস্ল্যাশ ব্যবহার করতে হবে:ruby -pe '$_.gsub!(/\t/," ")' < file.txt
ভিনক

0

যদি এটি শেল হিসাবে প্রয়োজন হয় bashবা ঠিক আছে zshতবে আমি এটি ভাবতে পারি এটির সবচেয়ে সহজ সমাধান:

sed "s/$(echo -n -e "\t")/ /" file.txt

তবে নোট করুন, echoপতাকাগুলি ( -nএবং -e) পসিক্সে অপরিবর্তিত রয়েছে, সুতরাং একটি পসিক্স কনফর্ম শেলটির জন্য এইগুলির পতাকাগুলি বোঝার দরকার নেই, তবুও অনেকগুলি সামঞ্জস্যতার কারণে করবে।


-1

আমি আশ্চর্য হয়েছি কেউ এর খুব সহজ সমাধানটির পরামর্শ দেয় নি: sed -i.bak -E 's/\\\t/ /' file.txt এর কৌশলটি করা উচিত।

আপনাকে পালাতে হবে (সুতরাং 3) গুলি) সেডকে বুঝতে দেওয়া যে আপনি যখন সবকিছু প্রতিস্থাপন করেন তখন আপনি নিয়মিত অভিব্যক্তিতে একটি character t অক্ষর ব্যবহার করার চেষ্টা করছেন ...


বিশেষত তিনটি ব্যাকস্ল্যাশ কেন?
মাইকেল হোমার

3
যদি আমি জিএনইউ ব্যবহার করি sedতবে \ একটি যথেষ্ট, কারণ কোনও পালানোর দরকার নেই। সমস্যাটি হ'ল বিএসডি sedট্যাবগুলির জন্য এই বাক্য গঠনটিকে সমর্থন করে না।
আইকনোক্লাস্ট

আমার এল ক্যাপিটেন নিয়ে কাজ করে না।
ফ্রাঙ্কলিন ইউ

-4

এটি আমার পক্ষে কাজ করেছে।

সেড-ই '/ / \ টি] / / জি'


3
আপনি জিএনইউ ব্যবহার করার কারণ এটি sed। এটি ওপি ব্যবহার করে না।
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.