কোনও ফাইলের একটি নির্দিষ্ট প্যাটার্ন বা স্ট্রিংয়ের পরে প্রতিটি লাইনকে কীভাবে মুছবেন?


21

ধরুন আমার কাছে একটি পাঠ্য ফাইলে ইউআরএলগুলির একটি তালিকা রয়েছে:

google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

আমি '.কম' এর পরে আসা সমস্ত কিছু মুছতে চাই।

প্রত্যাশিত ফলাফল:

google.com
unix.stackexchange.com
isuckatunix.com

আমি চেষ্টা করেছিলাম

sed 's/.com*//' file.txt 

তবে এটিও মুছে ফেলা .comহয়েছে।


এমন কোনও সুনির্দিষ্ট কারণ রয়েছে যার জন্য আপনি .comপ্রথমে সমস্ত /চরিত্রের পরে এবং মুছে ফেলার পরিবর্তে কেবল অনুসন্ধান করতে চান ? en.wikipedia.org/wiki/Ubuntuআপনার তালিকায় যদি আপনার মতো URL থাকে তবে কী হবে ?
বাইট কমান্ডার

উত্তর:


17

".কম" এর পরে উপস্থিত সমস্ত কিছু স্পষ্টভাবে মুছতে, ".কম (কিছু)" "" কম "এর সাথে প্রতিস্থাপনের জন্য আপনার বিদ্যমান সেড সমাধানটিকে সাম্প্রতিকভাবে চিহ্নিত করুন:

sed 's/\.com.*/.com/' file.txt

আমি প্রথম পিরিয়ড থেকে বাঁচতে আপনার রেজেক্সটি ট্যুইক করেছি; অন্যথায় এটি "thisiscommon.com / কিছু" এর মতো কিছু মিলছে।

নোট করুন যে আপনি ".com" প্যাটার্নটি একটি পিছনের ফরোয়ার্ড-স্ল্যাশ সহ আরও অ্যাঙ্কর করতে চাইতে পারেন যাতে আপনি দুর্ঘটনাক্রমে "sub.com.domain.com/foo" এর মতো কিছু ট্রিম না করে:

sed 's/\.com\/.*/.com/' file.txt

9

আপনি নিম্নলিখিত awkক্ষেত্রের ক্ষেত্র বিভাজক ( -F) ব্যবহার করতে পারেন :

$ cat file
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

$ cat file | awk -F '\\.com' '{print $1".com"}'
google.com
unix.stackexchange.com
isuckatunix.com

ব্যাখ্যা:

NAME
       awk - pattern scanning and processing language

-F fs
       --field-separator fs
              Use fs for the input field separator (the value of the FS predefined variable).

আপনি যেহেতু প্রতিটি জিনিস মুছতে চান .com, তার -F '.com'সাথে লাইন পৃথক করে .comএবং print $1আউটপুটটি কেবলমাত্র আগে ভাগ দেয় .com। সুতরাং, $1".com"যোগ .comএবং আপনাকে প্রত্যাশিত আউটপুট দেয়।


কেন শুধু /এফএস হিসাবে প্রথম ক্ষেত্র নিবেন না?
হিমাইল


1
@ পান্ড্য: এটি স্ট্রিংয়ের সাথে ব্যর্থacomercial.com/asdsad
কুওগল্ম

@ কুওংলম নির্দেশ করার জন্য ধন্যবাদ। উন্নত উত্তর
পান্ড্যা

4

না-ইন্টারেক্টিভ ইন-প্লেস ফাইল সম্পাদনা করার জন্য সেরা সরঞ্জাম ex

ex -sc '%s/\(\.com\).*/\1/ | x' file.txt

আপনি যদি ব্যবহার করেছেন viএবং যদি আপনি কোনও কমান্ড টাইপ করেন যা কোলন দিয়ে শুরু হয় :আপনি একটি প্রাক্তন কমান্ড ব্যবহার করেছেন। অবশ্যই আপনি আরও কার্যকর বা "অভিনব" কমান্ডগুলির বেশ কয়েকটি হ'ল ভিম এক্সটেনশানগুলি (উদাহরণস্বরূপ :bufdo) এবং এর জন্য পসিক্স স্পেসিফিকেশনগুলিতেex সংজ্ঞায়িত করা হয় নি , তবে এই স্পেসিফিকেশনগুলি সত্যই বিস্ময়কর ডিগ্রি পাওয়ার এবং অ-চাক্ষুষ ক্ষেত্রে নমনীয়তার অনুমতি দেয় পাঠ্য সম্পাদনা (ইন্টারেক্টিভ বা স্বয়ংক্রিয় হোক)।

উপরের কমান্ডটির বেশ কয়েকটি অংশ রয়েছে।

-sexব্যাচ ব্যবহারের জন্য প্রস্তুত করতে নীরব মোড সক্ষম করে । (আউটপুট বার্তাগুলি দমন করুন ইত্যাদি।)

-cএকবার file.txtবাফারে ফাইল ( , এই ক্ষেত্রে) খোলার পরে নির্বাহের জন্য কমান্ড নির্দিষ্ট করে ।

%এটি একটি ঠিকানা নির্দিষ্টকারীর সমতুল্য 1,$হ'ল নীচের কমান্ডটি বাফারের সমস্ত লাইনে প্রয়োগ করা হয়।

sবিকল্প কমান্ড যা আপনি সম্ভবত ইতিমধ্যে পরিচিত। এটি সাধারণত ব্যবহৃত হয় viএবং এর sকমান্ডেরsed সাথে মূলত অভিন্ন বৈশিষ্ট্যগুলি রয়েছে যদিও উন্নত কিছু রেগেক্স বৈশিষ্ট্যগুলি প্রয়োগের মাধ্যমে পৃথক হতে পারে। এই ক্ষেত্রে ".কম" থেকে লাইনের শেষ পর্যন্ত "" কম "দিয়ে প্রতিস্থাপন করা হবে।

উল্লম্ব দণ্ডটি কার্যকর করার জন্য ক্রমক্রমিক কমান্ডগুলি পৃথক করে। অনেকগুলি (সর্বাধিক) exবাস্তবায়নে আপনি অতিরিক্ত -cবিকল্পও ব্যবহার করতে পারেন , যেমন:

ex -sc '%s/\(\.com\).*/\1/' -c x file.txt

যাইহোক, এটি পসিক্স দ্বারা প্রয়োজন হয় না।

xকমান্ড প্রস্থান করে, ফাইলে কোনো পরিবর্তন লেখার পর। wqযার অর্থ "লিখুন এবং প্রস্থান করুন" এর বিপরীতে , xকেবল বাফার সম্পাদনা করা থাকলে কেবল ফাইলটিতে লিখুন। সুতরাং যদি আপনার ফাইলটি অপরিবর্তিত থাকে তবে টাইমস্ট্যাম্প সংরক্ষণ করা হবে।



1
এটি জায়গায় জায়গায় সম্পাদনা করে না। অন্তত, এটি Gnu sedএর বোগাস -i এর চেয়ে বেশি কিছু করে না। এটি অন-ডিস্ক বাফারগুলিতে পড়তে / লেখায়। নিজের জন্য ডাব্লু / ex -rএবং preserveআদেশ দেখুন।
মাইকসার্ভ

@ মাইকসার্ভ হুকুম কী preserve?
মতিন উলহাক

2

খুব দ্রুত, সহজ এবং নোংরা অজগর উপায়:

#!/usr/bin/env python
import sys
with open( sys.argv[1]  ) as file:
    for line in file:
        print line.split("/")[0]

নমুনা রান

skolodya@ubuntu:$ chmod +x removeStrings.py                                   

skolodya@ubuntu:$ ./removeStrings.py strings.txt                              
google.com
unix.stackexchange.com
isuckatunix.com


skolodya@ubuntu:$ cat strings.txt                                             
google.com/funny
unix.stackexchange.com/questions
isuckatunix.com/ireallydo

2
আমি দয়া করে ডাউনটোটের কারণ জানতে পারি?
সের্গেই কোলোডিয়াজনি

3
এটি কাজ করে, তবে এটি কোনও যত্ন করে না .com, এটি কেবল প্রথম /লাইনে শুরু হওয়া সমস্ত কিছু সরিয়ে দেয় । (যা আমার মতে আরও ভাল পদ্ধতির পক্ষে!)
বাইট কমান্ডার

1
@ বাইটকম্যান্ডার ঠিক ঠিক! যদি ডোমেনের নাম হয় .net, অন্য পদ্ধতির অংশে ডোমেন এবং সম্প্রসারণের পরে আসা অংশটি মুছে ফেলা হবে না, তাই এটি /বিভাজক হিসাবে ব্যবহার করা নিরাপদ ।
সের্গেই কোলোডিয়াজনি

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