সেড সমস্ত ট্যাব এবং স্পেসগুলি একটি একক স্থানের সাথে প্রতিস্থাপন করে


23

আমি নীচের মতো একটি স্ট্রিং পেয়েছি:

test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

এখন আমি রেকর্ডগুলির মধ্যে থাকা সমস্ত ট্যাব / স্পেসগুলি কেবল একটি একক স্থানের সাথে প্রতিস্থাপন করতে চাই যাতে আমি এটির সাহায্যে সহজেই এটি ব্যবহার করতে পারি cut -d " "

আমি নিম্নলিখিত চেষ্টা করেছিলাম:

sed "s/[\t[:space:]]+/[:space:]/g"

এবং বিভিন্ন রূপ আছে কিন্তু এটি কাজ করতে পারেনি। কোন ধারনা?


চেষ্টা করুন: সেড-আর-ই "এস / [\ টি \] + / / জি"
আরজেএস

আপনার cutসমর্থন -wবিকল্প আছে?
কনডিবাস

উত্তর:


40

ব্যবহার sed -e "s/[[:space:]]\+/ /g"

এখানে একটি ব্যাখ্যা:

[   # start of character class

  [:space:]  # The POSIX character class for whitespace characters. It's
             # functionally identical to [ \t\r\n\v\f] which matches a space,
             # tab, carriage return, newline, vertical tab, or form feed. See
             # https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

]   # end of character class

\+  # one or more of the previous item (anything matched in the brackets).

আপনার প্রতিস্থাপনের জন্য, আপনি কেবল একটি স্থান সন্নিবেশ করতে চান। [:space:]সেখানে কাজ করবে না যেহেতু এটি একটি অক্ষর শ্রেণীর জন্য সংক্ষেপণ এবং রেজেক্স ইঞ্জিনটি জানতে পারে না যে সেখানে কোন অক্ষর রাখতে হবে।

+কারণ sed এর Regex ইঞ্জিন Regex মধ্যে পলান করা আবশ্যক +একটি স্বাভাবিক চরিত্র যেহেতু হয় \+'এক বা একাধিক' এর জন্য একটি metacharacter হয়। মাস্টারিং রেগুলার এক্সপ্রেশনের ৮ 86 পৃষ্ঠায় জেফ্রি ফ্রেইড একটি পাদটীকাতে উল্লেখ করেছেন যে এড এবং গ্রেপ পলায়নযোগ্য বন্ধনী ব্যবহার করেছেন কারণ "কেন থম্পসন মনে করেছিলেন নিয়মিত প্রকাশগুলি সি কোডের সাথে প্রাথমিকভাবে কাজ করতে ব্যবহৃত হত, যেখানে কাঁচা বন্ধনীর সাথে ম্যাচ করার প্রয়োজন ব্যাকরফেরেন্সিংয়ের চেয়ে বেশি সাধারণ হবে where । " আমি ধরে নিয়েছি যে প্লাস সাইন সম্পর্কে তিনি একইরকম অনুভূত হয়েছিল, তাই এটি একটি মেটাচ্যারাক্টর হিসাবে ব্যবহার করার জন্য এড়াতে হবে। এটির দ্বারা বিভক্ত হওয়া সহজ।

ইন sed আপনি অব্যাহতি প্রয়োজন হবে +, ?, |, (, এবং )। বা প্রসারিত রেজেক্স ব্যবহার করতে -r ব্যবহার করুন (তারপরে এটি দেখতে sed -r -e "s/[[:space:]]\+/ /g"বা এর মতো দেখাবে)sed -re "s/[[:space:]]\+/ /g"


এটি কি ট্যাবগুলিও সরিয়ে দেয়? আপনি ব্যাখ্যা করতে পারেন কেন আপনি ন্যায়বিচারের \+পরিবর্তে ব্যবহার করেন +?
জুলাকিস

ঠিক আছে আমি বুঝেছি. [[: স্থান:]] [[t \ r \ n \ v \ f] এর সমান। তবে আপনি দয়া করে কীভাবে ব্যবহার করছেন তা ব্যাখ্যা করতে পারেন\+
জুলাকিস

3
[[: স্পেস:]] '\ s' এর সমতুল্য, তাই সংক্ষিপ্ত সংস্করণটি "s / \ s \ + / / g"
মোলো

2
"পূর্ববর্তী অক্ষর বা গোষ্ঠীর এক বা একাধিক", উত্স বিকাশকারী.অ্যাপল . com/ লাইব্রেরি / ম্যাক /# ডকুমেন্টেশন / ওপেনসোর্স / mean বলতে ব্যবহৃত হলে বেসিক নিয়মিত এক্সপ্রেশনগুলি প্লাস সাইন এর আগে একটি ব্যাকস্ল্যাশ ব্যবহার করে ।
3molo

আহ, বুঝলাম! আমি জানি না যে বিভিন্ন রেইগেক্স সংস্করণ ছিল। ধন্যবাদ
জুলাকিস

6

আপনি এর -s("চেপে ধরুন") বিকল্পটি ব্যবহার করতে পারেন tr:

$ tr -s '[:blank:]' <<< 'test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

[:blank:]চরিত্র শ্রেণী উভয় স্পেস এবং ট্যাব গঠিত।


-2

ব্যাশের জন্য আমি নীচের নামটি ব্যবহার করতে চাই like অন্যেরা যা লিখেছিল তার উপর ভিত্তি করে একাধিক স্পেস একসাথে স্থান অনুসন্ধান এবং প্রতিস্থাপনের জন্য সেড ব্যবহার করুন। এটি কাটা থেকে ধারাবাহিক ফলাফল পেতে সহায়তা করে। শেষে, আমি এটিকে আরও একবার সময় চালনা করে স্থানটি ট্যাবে পরিবর্তন করতে যাতে এটি পড়া সহজ হয়।

alias ll='ls -lh | sed "s/ \+/ /g" | cut -f5,9 -d" " | sed "s/ /\t/g"'

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