আমি কীভাবে BSD সেডকে escape n এবং \ t এর মতো পালানোর ক্রমগুলি ব্যাখ্যা করতে নির্দেশ দিতে পারি?


14

আমার একটি সেড রিপ্লেসমেন্ট কমান্ড রয়েছে যা আমি বিএসডি sedপাশাপাশি জিএনইউর সাথে সামঞ্জস্য রাখতে চাই sed। এই ক্ষেত্রে আমার প্রয়োজন নেই বলে বর্ধিত নিয়মিত প্রকাশগুলি কোনও সমস্যা নয়। আমার প্রাথমিক সমস্যাটি প্রতিস্থাপনের স্ট্রিংগুলিতে যেভাবে দু'জন sedচরিত্রের পালানোর সিকোয়েন্স ব্যাখ্যা করে তার মধ্যে পার্থক্য । আমার প্রতিস্থাপনের স্ট্রিংয়ে ট্যাব এবং নিউলাইন রয়েছে এবং আমি চাইছি রক্ষণাবেক্ষণের স্বাচ্ছন্দ্যের জন্য কমান্ড স্ট্রিংগুলিতে সেগুলি দৃশ্যমান হোক, তবে, বিএসডি এস্কেপ সিকোয়েন্সগুলি ব্যাখ্যা করে না এবং জিএনইউ করে । বিএসডি-তে এই পালানোর ক্রমগুলি ব্যাখ্যা করার উপযুক্ত নির্দেশ কী ? নিম্নলিখিত দুটি স্নিপেটগুলি আমার সমস্যার চিত্র তুলে ধরেছে:sedsed sed

গনুহ sed

echo ABC | sed 's/B/\n\tB\n'

yeilds

A
    B
C

বাসদ sed

echo ABC | sed 's/B\n\tB\n'

উৎপাদনের

AntBnC

স্পষ্টতই, \nএবং \tবিএসডি দ্বারা পালানোর ক্রম হিসাবে ব্যাখ্যা করা হয় নাsed

এখন, আমার প্রশ্ন। বিএসডি sedম্যানপেজ অনুসারে :

প্রতিস্থাপনের স্ট্রিংয়ে একটি নতুন লাইন অক্ষর নির্দিষ্ট করতে, এটি ব্যাকস্ল্যাশ দিয়ে আগে করুন।

এটি কি বোঝায় যে আমাকে ব্যাকস্ল্যাশের মাধ্যমে আক্ষরিক নতুন লাইনের আগে চলে যাওয়া দরকার ? প্রতিস্থাপন পাঠ্যের sedমতো পালানোর ক্রমগুলি ব্যাখ্যা করার উপযুক্ত নির্দেশ কী \n?


2
বিএসডি সেড জিএনইউ শেড নয় এবং আমি মনে করি না যে এটি আউটপুটটিতে এই জাতীয় পলায়নকে সমর্থন করে। আপনাকে হয় আক্ষরিক অক্ষর সন্নিবেশ করতে হবে, GNU সেড ইনস্টল করতে হবে বা এমন কিছুতে স্যুইচ করতে হবে যা এইডকের মতো এস্কেপগুলি সমর্থন করে।
jw013

@ jw013, আমি উভয়ের মধ্যে পার্থক্য সম্পর্কে পরিষ্কার জিএনইউ সেড ইনস্টল করা কোনও বিকল্প নয়। আমি যে বিষয়টি পরে করছি তা সম্পাদন করার জন্য আমি দুজনের মধ্যে পর্যাপ্ত সাধারণ ক্ষেত্র খুঁজে পাওয়ার আশা করছিলাম sed। শেষ পর্যন্ত এটি সম্ভবত awk ব্যবহার করার জন্য বোধগম্য হবে। সুতরাং আমি যে BSD সেড ম্যানপেজটি উদ্ধৃত করেছি তার ব্যাখ্যা সম্পর্কে আপনি কী ভাবেন?
এফস্মিথ

2
হ্যাঁ, আপনাকে আক্ষরিক ট্যাব এবং নিউলাইনগুলি ব্যবহার করতে হবে এবং নিউলাইনগুলির সাথে আপনার এগুলি একটি ব্যাকস্ল্যাশের আগেও দরকার, যা মূলত কেবল একটি লাইন-ধারাবাহিকতা ব্যবস্থা।
jw013

@ jw013, আপনার দুর্দান্ত উত্তরের জন্য ধন্যবাদ। এই মুহুর্তে, রক্ষণাবেক্ষণের জন্য, আমি আপনার পরামর্শ নেব এবং আমার সমাধানটিকে পুনরায় কাজ করব work
এফস্মিথ

ভাল পছন্দ - বর্তমানে গৃহীত উত্তরের চেয়ে আরও ভাল পরিকল্পনা
হ'ল

উত্তর:


6

আপনার যদি পোর্টেবল স্ক্রিপ্টগুলি লেখার প্রয়োজন হয় তবে আপনার পসিক্স স্ট্যান্ডার্ড (ওরফে সিঙ্গেল ইউনিক্স ওরফে ওপেন গ্রুপ বেস স্পেসিফিকেশন) এর বৈশিষ্ট্যগুলি আটকে থাকা উচিত । ইস্যু 7 ওরফে POSIX-1.2008 সর্বশেষতম, তবে অনেক সিস্টেম এখনও এটি গ্রহণ করা শেষ করেনি। ইস্যু 6 ওরফে পসিআইএক্স-1.2001 সমস্ত আধুনিক ইউনিট দ্বারা সরবরাহ করা হয় এবং বড় সরবরাহ করা হয়।

ইন sed মত পালাবার ক্রম অর্থ \tএবং \nনা পোর্টেবল ছাড়া একটি হল Regex , \nএকটি newline জন্য দাঁড়িয়েছে। কোনও sকমান্ডের প্রতিস্থাপন পাঠ্যে , \nপোর্টেবল নয়, তবে আপনি একটি নতুন লাইনের জন্য দাঁড়াতে সিকোয়েন্স ব্যাকস্ল্যাশ-নিউলাইন ব্যবহার করতে পারেন।

একটি ট্যাব অক্ষর উত্পন্ন করার জন্য একটি বহনযোগ্য উপায় (বা অন্য কোনও অক্ষর যা অক্টাল দ্বারা প্রকাশিত) সাথে রয়েছে tr। শেল ভেরিয়েবলের মধ্যে অক্ষর সংরক্ষণ করুন এবং সেড স্নিপেটে এই পরিবর্তনশীলটিকে বিকল্প দিন itute

tab=$(echo | tr '\n' '\t')
escape=$(echo | tr '\n' '\033')
embolden () {
  sed -e 's/^/'"$escape"'[1m/' -e 's/$/'"$escape"'[0m/'
}

আবার নোট করুন যে নতুনরেখাগুলি রেগেক্সে এবং sপ্রতিস্থাপন পাঠ্যে আলাদাভাবে প্রকাশ করা দরকার ।

আপনি সম্ভবত এর পরিবর্তে awk ব্যবহার করতে চাইতে পারেন । এটি \oooপ্রতিটি স্ট্রিং আক্ষরিক ক্ষেত্রে অক্টাল পলায়ন সহ ব্যাকস্ল্যাশ পালাতে সক্ষম করে।


7

আপনি $'...'স্ট্রিংটি পাস করার আগে পলায়নগুলির ব্যাখ্যা করতে ব্যাশের উদ্ধৃতি ব্যবহার করতে পারেন sed

বাশ ম্যান পৃষ্ঠা থেকে:

   Words  of  the  form  $'string'  are  treated specially.  The word
   expands to string, with backslash-escaped characters  replaced  as
   specified  by the ANSI C standard.  Backslash escape sequences, if
   present, are decoded as follows:
          \a     alert (bell)
          \b     backspace
          \e     an escape character
          \f     form feed
          \n     new line
          \r     carriage return
          \t     horizontal tab
          \v     vertical tab
          \\     backslash
          \'     single quote
          \nnn   the eight-bit character whose  value  is  the  octal
                 value nnn (one to three digits)
          \xHH   the eight-bit character whose value is the hexadeci-
                 mal value HH (one or two hex digits)
          \cx    a control-x character

   The expanded result is single-quoted, as if the  dollar  sign  had
   not been present.

   A  double-quoted  string  preceded by a dollar sign ($) will cause
   the string to be translated according to the current  locale.   If
   the  current locale is C or POSIX, the dollar sign is ignored.  If
   the string is translated and replaced, the replacement is  double-
   quoted.

3

স্ট্যাক ওভারফ্লোতে এটির জবাব দেওয়া হয়েছে:

/programming/1421478/how-do-i-use-a-new-line-replacement-in-a-bsd-sed

এটি jw013 যা বলেছিল ঠিক তেমনই।

যাতে একটি আক্ষরিক ট্যাব টাইপ সন্নিবেশ করতে ctrl+ + VTab


রেফারেন্সের জন্য ধন্যবাদ। আমি ঘৃণা করি যে আমার গুগল অনুসন্ধানগুলি সেই লিঙ্কটি
ফেরেনি

1
Ctrl-V ট্যাব পরামর্শটি শেল নির্ভর, উদাহরণস্বরূপ এটি মাছে কাজ করবে না।
অ্যান্ডডাম

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