সেড 4 স্পেস 2 এ রূপান্তর করে


14

একজন কীভাবে 4 স্পেসকে 2 স্পেসে রূপান্তর করতে পারে sed? এটা কি সম্ভব?

আমি এটি খুঁজে পেয়েছি তবে এটি ট্যাবটিকে স্পেসে রূপান্তর করে:

sed -r ':f; s|^(\t*)\s{4}|\1\t|g; t f' file

উত্তর:


13

আপনার পোস্ট করা স্ক্রিপ্টটি 4 * n স্পেসগুলিকে n ট্যাবগুলিতে রূপান্তর করে, কেবল যদি সেই স্থানগুলি কেবলমাত্র ট্যাবগুলির আগে থাকে।

যদি আপনি 4 টি স্পেস 2 স্পেস দ্বারা প্রতিস্থাপন করতে চান তবে কেবল ইনডেন্টেশনে, যখন সেড দিয়ে এটি করা সম্ভব হয় তবে আমি তার পরিবর্তে পার্লের পরামর্শ দিই।

perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file

সেড ইন:

sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~    /\1  ~/' -e 't r' -e 's/~//' file

indentপরিবর্তে আপনি ব্যবহার করতে পারেন ।


আমি পেয়েছিNested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.
এডিজেক

1
@ অ্যাডিজিক ওহ, সত্যই, এটি এবং আরও কয়েকটি বাগ রয়েছে। আমি প্রকৃত পার্ল কোড দ্বারা গব্লেডিগুক প্রতিস্থাপন করেছি।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

5

সোজা উপায় কাজ করে না:

sed -r 's/ {4}/  /g'

যদি তা না হয় তবে কিছুটা ইনপুট পোস্ট করুন যেখানে এটি ব্যর্থ।


1
এটি লাইনের শুরুতে আবদ্ধ নয়। আপনি যদি এটি অ্যাঙ্কর করেন তবে এটি একাধিক ম্যাচের জন্য কাজ করবে না। সুতরাং আমরা নীচে unix.stackexchange.com/a/375200/259620আছি
geek-Merlin

আপনার 2 স্পেস এবং 4 স্পেসের সংমিশ্রণ থাকলে এটি কাজ করে না, কারণ দু'জনের দুটি ইন্ডেন্টেশন চারটি হিসাবে গণ্য হবে ...
ম্যাট ফ্লেচার

@ অ্যাক্সেল: ওপি
থোর

@ ম্যাটফ্লেচার: প্রশ্নটি ছিল 4 টি স্পেস 2 এর সাথে প্রতিস্থাপন করার বিষয়ে, তাই আমি আপনার বক্তব্যটি দেখতে ব্যর্থ হই
থোর

4

যদি কেবল শীর্ষস্থানীয় স্থানগুলিকে রূপান্তর করা হয়:

sed 'h;s/[^ ].*//;s/    /  /g;G;s/\n *//'

মন্তব্য সহ:

sed '
  h; # save a copy of the pattern space (filled with the current line)
     # onto the hold space
  s/[^ ].*//; # remove everything starting with the first non-space
              # from the pattern space. That leaves the leading space
              # characters
  s/    /  /g; # substitute every sequence of 4 spaces with 2.
  G; # append a newline and the hold space (the saved original line) to
     # the pattern space.
  s/\n *//; # remove that newline and the indentation of the original
            # line that follows it'

এছাড়াও ভিএম এর 'ts'সেটিং এবং :retabকমান্ড দেখুন


আপনার ভিএম সলিউশনটি ব্যবহার করে, ভিচ-এর মতো বেশ কয়েকটি ফাইল সম্পাদনা করার ব্যাচ করার কোনও উপায় আছে কি? অন্যথায় আমি অনুমান করছি যে আমাকে একটি ম্যাক্রো তৈরি করতে হবে?
ক্রিসজলি

নোট করুন 'ts'এবং :retabপ্রশ্নের সমাধান নয়, তবে এটি সম্পর্কিত এবং আপনার সামগ্রিক লক্ষ্য মোকাবেলায় সহায়তা করতে পারে। আপনি করতে পারেন vim -- *.c, :set ts=...এবং তারপর :argdo retabবা :argdo retab!। আরও দেখুন 'sw'বিকল্প এবং তেজ নিজস্ব ইন্ডেন্টিং ক্ষমতা।
স্টাফেন চেজেলাস

2
sed 's/^\( \+\)\1\1\1/\1\1/' file

এটি নেতৃস্থানীয় স্পেসগুলি একই গ্রুপের চারটি দৃষ্টান্তে বিভক্ত করে কাজ করে (যাতে তারা সবাই সমান) এবং তারপরে তাদের গ্রুপটির মাত্র দুটি উদাহরণ দিয়ে প্রতিস্থাপন করে।


এটি কীভাবে বিদ্যমান সমাধানগুলিতে উন্নতি করে?
ফিলিপস

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

মজাদার. খুশি আমি জিজ্ঞাসা করেছি। সাধারণত পশ্চাদপসরণগুলি বৈশ্বিক পতাকার চেয়ে খারাপ বলে বিবেচিত হয়। তবে আপনি সহজেই আরও পোর্টেবল স্ক্রিপ্ট (এড়ানো \+) এর মাধ্যমে একই জিনিসটি অর্জন করতে পারেন । ধন্যবাদ.
ফিলিপস

1
sed 's/    \{2,4\}\( \{0,1\}[^ ].*\)*/  \1/g' <input

এটি কেবল ফাঁকা জায়গাগুলির শীর্ষস্থানীয় ক্রমগুলি পাকানো উচিত।

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