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


উত্তর:


2758

লাইনটি সরাতে এবং আউটপুটটিকে স্ট্যান্ডার্ড আউট প্রিন্ট করতে:

sed '/pattern to match/d' ./infile

ফাইলটি সরাসরি সংশোধন করতে - BSD সেডের সাথে কাজ করে না:

sed -i '/pattern to match/d' ./infile

একই, তবে বিএসডি সেডের জন্য (ম্যাক ওএস এক্স এবং ফ্রিবিএসডি) - জিএনইউ সেডের সাথে কাজ করে না:

sed -i '' '/pattern to match/d' ./infile

ফাইলটি সরাসরি সংশোধন করতে (এবং একটি ব্যাকআপ তৈরি করতে) - BSD এবং GNU সেডের সাথে কাজ করে:

sed -i.bak '/pattern to match/d' ./infile

13
ধন্যবাদ, তবে এটি ফাইল থেকে মুছে ফেলা হবে বলে মনে হচ্ছে না তবে কেবল স্ট্রিং ছাড়াই পাঠ্য ফাইলের সামগ্রীগুলি মুদ্রণ করে।
একটি ক্লকওয়ার্ক কমলা

115
@ এ ক্লকওয়ার্ক: হ্যাঁ, আপনাকে আউটপুটটি কোনও নতুন ফাইলে ডাইরেক্ট করতে হবে এমন কিছু সহ sed '/pattern to match/d' ./infile > ./newfileবা যদি আপনি কোনও স্থান-সম্পাদনা করতে চান তবে আপনি -iপতাকাটি সিডে যুক্ত করতে পারেন sed -i '/pattern to match/d' ./infile। নোট করুন যে -iপতাকাটির জন্য GNU
সেড

16
কিছু স্বাদ এর সেড জন্য; সেডের "-i" পতাকাটি সরবরাহের জন্য একটি বর্ধনের প্রয়োজন। (উদাহরণস্বরূপ sed -i.backup '/pattern to match/d' ./infile) এটি আমাকে ইন-প্লেস সম্পাদনাগুলি সহ পেয়ে গেছে।
avelis

9
@ সিজেএক্স আরও ভাল, sedসংস্করণ-নিয়ন্ত্রিত নয় এমন কোনও ফাইলের মতো কমান্ড প্রয়োগ করবেন না ।
ম্যাট্রিক্সফ্রোগ

84
Mac OS X এর ব্যবহারকারীদের জন্য আরও একটি নোট: কিছু কারণে, -i পতাকা একটি আর্গুমেন্ট পাস করা প্রয়োজন, এমনকি যদি এটা শুধু একটি খালি স্ট্রিং ব্যাপার আরকি sed -i '' '/pattern/d' ./infile
গেরলিংগুই

629

নির্দিষ্ট স্ট্রিং সহ লাইনগুলি মুছে ফেলার আরও অনেক উপায় রয়েছে sed:

awk

awk '!/pattern/' file > temp && mv temp file

রুবি (১.৯+)

ruby -i.bak -ne 'print if not /test/' file

পার্ল

perl -ni.bak -e "print unless /pattern/" file

শেল (bash 3.2 এবং পরবর্তী)

while read -r line
do
  [[ ! $line =~ pattern ]] && echo "$line"
done <file > o
mv o file

জিএনইউ গ্রেপ

grep -v "pattern" file > temp && mv temp file

এবং অবশ্যই sed(প্রকৃত মুছে ফেলার চেয়ে বিপরীতটি প্রিন্ট করা দ্রুত)

sed -n '/pattern/!p' file

4
প্যাটার্ন সহ একটি নির্দিষ্ট লাইন এবং তারপরে লাইনটি কীভাবে মুছবেন? আমি বিভিন্ন তথ্য মধ্যে হাজার হাজার লাইনের সাথে জরিমানা করেছি।
ortাকা ক্লাউড_ডিসিল

1
ওএস / এক্স-তে, শেলের ভিন্নতা নেতৃস্থানীয় স্থানগুলি সংরক্ষণ করে না, তবে গ্রেপ-ভি প্রকরণটি আমার পক্ষে ভালভাবে কাজ করেছে।
পল বাউস্টারিয়ান

13
sedউদাহরণস্বরূপ একটি ভিন্ন আচরণ আছে, এটি শুধুমাত্র greps! এটা কিছু হতে হবে sed -n -i '/pattern/!p' file
সিজারসোল

8
প্রতিটি লাইন প্যাটার্নের সাথে মিলে গেলে গ্রেপ সংস্করণ কাজ করে না। আরও ভাল করা: grep -v "pattern" file > temp; mv temp fileএটি প্রত্যাবর্তনের মানের উপর নির্ভর করে অন্য কয়েকটি উদাহরণের জন্য প্রয়োগ হতে পারে।
ক্রিস মেইস

1
"উল্টোটি মুদ্রণ করা প্রকৃত মুছে ফেলার চেয়ে দ্রুত" - আমার মেশিনে নেই (2012 ম্যাকবুক এয়ার, ওএস এক্স 10.13.2)। ফাইল তৈরি করুন: seq -f %f 10000000 >foo.txttime sed -i '' '/6543210/d' foo.txtসেড ডি: আসল 0 মি 9.294 সে। time sed -i '' -n '/6543210/!p' foo.txtসেড ! পি: আসল 0 মি 13.671 সে। (ছোট ফাইলগুলির জন্য, পার্থক্যটি আরও বড়))
জ্যাকসাহনওয়াল্ড গোফন্ডমোনিকা জানায়

252

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

যেমন

sed -i '/pattern/d' filename      

অথবা

grep -v "pattern" filename > filename2; mv filename2 filename

প্রথম কমান্ডটি যাইহোক আমার মেশিনে 3 গুণ বেশি সময় নেয়।


19
আপনার উত্তরটি ভোট দেওয়া, কেবলমাত্র আপনি একটি পারফরম্যান্স তুলনা করার চেষ্টা করেছিলেন বলে!
অনুরাগ

4
গ্রেপ লাইনের সাথে বর্তমান ফাইলটি ওভাররাইট করার বিকল্পের জন্য +1।
Rhyuk

2
দ্বিতীয় '
গ্রেপ

3
পারফরম্যান্সের পার্থক্য কী হবে তা আমি জানতে আগ্রহীsed '/pattern/d' filename > filename2; mv filename2 filename
পিট

8
(উবুন্টু / ইউএসআর / শেয়ার / ডিক / শব্দ ব্যবহার করে) গ্রেপ এবং এমভি: 0.010 এস | সেড জায়গায়: 0.197 এস | sed এবং ভন: 0.031s
ReactiveRaven

76

জিএনইউ সহ এটি করার সহজ উপায় sed:

sed --in-place '/some string here/d' yourfile

55
অন্যরা যারা এই প্রশ্নোত্তর প্রবন্ধটিতে ঝাঁপিয়ে পড়ে এবং শেল স্ক্রিপ্টিংয়ের ক্ষেত্রে নতুন তাদের জন্য একটি সহজ টিপস: কমান্ড লাইনে ওয়ান-টাইম ব্যবহারের জন্য সংক্ষিপ্ত বিকল্পগুলি ঠিক আছে, তবে তারা বেশি পঠনযোগ্য হওয়ার কারণে স্ক্রিপ্টগুলিতে দীর্ঘ বিকল্পগুলি পছন্দ করা উচিত।
ডেনিস

3
--In-place পতাকার জন্য +1। অনুমতিগুলি সুরক্ষিত ফাইলগুলির মধ্যে আমার এটি পরীক্ষা করা দরকার। (কিছু ব্যবহারকারীর স্ক্রাবিং করতে হবে))
মৌমাছি কে

8
নোট করুন যে দীর্ঘ বিকল্পটি কেবল জিএনইউ সেডগুলিতে উপলব্ধ। ম্যাক এবং বিএসডি ব্যবহারকারীদের এটি করার জন্য জিএসড ইনস্টল করতে হবে।
ম্যাট

অন্য টিপ: যদি আপনার রেজেক্সটি মেলে না দেখা যায়, -rবিকল্পটি চেষ্টা করুন (বা -Eআপনার সংস্করণ অনুসারে)। এই Regex metacharacters ব্যবহার সক্ষম +, ?, {...}এবং (...)
rjh

এটির সঠিক উত্তর যখন আপনার ডিস্কের আর কোনও স্থান না থাকে এবং আপনি পাঠ্যটি অন্য কোনও ফাইলে অনুলিপি করতে পারবেন না। এই আদেশ কি প্রশ্ন করা হয়েছিল?
ফেরেরিব্রগা

38

আপনি ব্যবহারটি বিবেচনা করতে পারেন ex(যা একটি মান ইউনিক্স কমান্ড-ভিত্তিক সম্পাদক):

ex +g/match/d -cwq file

কোথায়:

  • +প্রদত্ত প্রাক্তন কমান্ড ( man ex) প্রয়োগ -cকরে যা কার্যকর করে wq(লিখুন এবং প্রস্থান করুন)
  • g/match/d- প্রদত্ত সহ লাইনগুলি মুছে ফেলার জন্য প্রাক্তন কমান্ড match, দেখুন: জি পাওয়ার

উপরের উদাহরণটি ইউনিক্স.এসই এবং পোস্টের জন্য পসিএক্স স্পেসিফিকেশন exঅনুসারে এই পোস্ট অনুসারে কোনও ফাইল সম্পাদনা করার জন্য একটি পসিক্স-সম্মতিজনক পদ্ধতি


এর সাথে পার্থক্যটি sedহ'ল:

sedএকটি হল এস tream ইডি itor, না একটি ফাইল এডিটর। BashFAQ

আপনি যদি অপ্রয়োজনীয় কোড উপভোগ না করেন তবে I / O ওভারহেড এবং কিছু অন্যান্য খারাপ পার্শ্ব প্রতিক্রিয়া। সুতরাং মূলত কিছু প্যারামিটারগুলি (যেমন স্থানটিতে / -i) অ-মানক ফ্রিবিএসডি এক্সটেনশান এবং অন্যান্য অপারেটিং সিস্টেমে উপলব্ধ নাও হতে পারে।


5
দারুণ ... যখন আমি কি man exএটা আমার জন্য মানুষ দেয় vim, মনে exতেজ অংশ ... যদি আমি ডান মানে প্যাটার্ন সিনট্যাক্স বোঝা matchহয় vimregex.com যা একই কিন্তু POSIX এবং PCRE স্বাদে আলাদা?
অ্যান্ট্রপিক

1
:g হয় POSIX-অনুবর্তী কিছু কমান্ড অসম্মান পার্থক্য । আমি ধরে নিই পিসিআরই এর উপর ভিত্তি করে ছিল।
কেনারব

16

আমি ম্যাক নিয়ে এই নিয়ে লড়াই করে যাচ্ছিলাম। এছাড়াও, পরিবর্তনশীল প্রতিস্থাপন ব্যবহার করে আমার এটি করা দরকার।

সুতরাং আমি ব্যবহার করেছি:

sed -i '' "/$pattern/d" $file

যেখানে $fileফাইল যেখানে মুছে ফেলার প্রয়োজন এবং হয় $patternপ্যাটার্ন মুছে ফেলার জন্য মিলেছে করা হয়।

আমি ''এই মন্তব্য থেকে চয়ন ।

এখানে খেয়াল করা জিনিস ব্যবহার উদ্ধৃতি চিহ্ন মধ্যে "/$pattern/d"। পরিবর্তনশীল কাজ করবে না যখন আমরা একক উদ্ধৃতি ব্যবহার করি।


3
ম্যাকের sedপরে একটি প্যারামিটার প্রয়োজন -i, সুতরাং আপনি যদি ব্যাকআপ না চান তবে আপনাকে এখনও একটি খালি স্ট্রিং যুক্ত করতে হবে:-i ''
উইসবাকী

শেল ব্যবহারের জন্য sed -i "/$pattern/d" $file। আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ।
আশওয়াকর

14

আমি একটি ফাইল দিয়ে একটি ছোট বেঞ্চমার্ক তৈরি করেছি যার মধ্যে প্রায় 345,000 লাইন রয়েছে। সাথে পথ grepপ্রায় 15 বার তুলনায় দ্রুততর হবে বলে মনে হয় sedএই ক্ষেত্রে পদ্ধতি।

আমি এলসি_এলএল = সি নির্ধারণ না করে এবং উভয়ই চেষ্টা করেছি, সময়গুলি উল্লেখযোগ্যভাবে পরিবর্তিত হবে বলে মনে হয় না। অনুসন্ধানের স্ট্রিং (CDGA_00004.pdbqt.gz.tar) ফাইলের মাঝখানে কোথাও রয়েছে।

আদেশগুলি এবং সময়গুলি এখানে:

time sed -i "/CDGA_00004.pdbqt.gz.tar/d" /tmp/input.txt

real    0m0.711s
user    0m0.179s
sys     0m0.530s

time perl -ni -e 'print unless /CDGA_00004.pdbqt.gz.tar/' /tmp/input.txt

real    0m0.105s
user    0m0.088s
sys     0m0.016s

time (grep -v CDGA_00004.pdbqt.gz.tar /tmp/input.txt > /tmp/input.tmp; mv /tmp/input.tmp /tmp/input.txt )

real    0m0.046s
user    0m0.014s
sys     0m0.019s

আপনি কোন প্ল্যাটফর্মে আছেন? আপনি সেড / পারেল / গ্রেপের কোন সংস্করণ ব্যবহার করেন?
হ্যাগেলো

আমি যে প্ল্যাটফর্মটি ব্যবহার করি তা হ'ল লিনাক্স (জেন্টো)। সেড সংস্করণটি জিএনইউ সেড ভি 4.2.2, পার্ল সংস্করণ পার্ল 5 (আমি পরীক্ষার সময় আমি কোন সংশোধনটি ব্যবহার করতে পারি তা বলতে পারি না), এবং গ্রেপ (জিএনইউ) সংস্করণ 3.0।
জাদজিয়া

14

আপনি এটি ব্যবহার করতে পারেন:

 grep -v 'pattern' filename

এখানে -vকেবল আপনার প্যাটার্ন ছাড়া অন্য মুদ্রণ করা হবে (এর অর্থ উল্টো মিল)।


কোনও নির্দিষ্ট স্ট্রিং যুক্ত ডিরেক্টরিতে আমি কীভাবে লাইনগুলি মুছতে পারি
নামমানিমো

13

ফলাফল সহ কোনও স্থান পেতে grepআপনি এটি করতে পারেন:

echo "$(grep -v "pattern" filename)" >filename

4
এটি কেবল bashশেল বা অনুরূপ (নয় tcsh) এর জন্য ভাল।
এ্যাসিমেট


4
perl -i    -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3

প্রথম কমান্ড ফাইল (গুলি) ইনপ্লেস (-i) সম্পাদনা করে।

দ্বিতীয় কমান্ড একই কাজ করে তবে ফাইলের নামের সাথে .bk যুক্ত করে মূল ফাইল (গুলি) এর একটি অনুলিপি বা ব্যাকআপ রাখে (.bk যে কোনও কিছুতে পরিবর্তন করা যায়)।



2

স্ট্রিংয়ের সঠিক ম্যাচের জন্য কেউ যদি এটি করতে চায় তবে আপনি পুরোপুরি -wপতাকাটি গ্রেপ - ডাব্লুতে ব্যবহার করতে পারেন । এটি উদাহরণস্বরূপ, যদি আপনি 11 নম্বরযুক্ত লাইনগুলি মুছতে চান তবে 111 নম্বর সহ লাইনগুলি রাখুন:

-bash-4.1$ head file
1
11
111

-bash-4.1$ grep -v "11" file
1

-bash-4.1$ grep -w -v "11" file
1
111

-fআপনি একবারে বেশ কয়েকটি সঠিক নিদর্শন বাদ দিতে চাইলে এটি পতাকাটির সাথেও কাজ করে। যদি "ব্ল্যাকলিস্ট" হ'ল প্রতিটি লাইনে একাধিক নিদর্শন সহ এমন একটি ফাইল যা আপনি "ফাইল" থেকে মুছতে চান:

grep -w -v -f blacklist file

কিছুটা বিভ্রান্তিকর। -w, --word-regexp Select only those lines containing matches that form whole words.বনাম-x, --line-regexp Select only those matches that exactly match the whole line. For a regular expression pattern, this is like parenthesizing the pattern and then surrounding it with ^ and $.
সাঁই


0

কনসোলে চিকিত্সা করা পাঠ্যটি দেখানোর জন্য

cat filename | sed '/text to remove/d' 

চিকিত্সা পাঠ্য একটি ফাইলে সংরক্ষণ করতে

cat filename | sed '/text to remove/d' > newfile

চিকিত্সা পাঠ্য তথ্য একটি বিদ্যমান ফাইল সংযোজন

cat filename | sed '/text to remove/d' >> newfile

ইতিমধ্যে চিকিত্সা করা পাঠ্যের চিকিত্সা করার জন্য, এক্ষেত্রে যা সরানো হয়েছে তার আরও লাইন সরিয়ে ফেলুন

cat filename | sed '/text to remove/d' | sed '/remove this too/d' | more

| moreএকটি সময়ে এক পৃষ্ঠার খন্ডে টেক্সট প্রদর্শন করবে।


0

আপনি যে উত্তরটি ব্যবহার করেন সেটিরed অনুরূপ ফাইলে কোনও ফাইল সম্পাদনা করতে ভাল পুরানো ব্যবহার করতে পারেন । এই ক্ষেত্রে বড় পার্থক্য হ'ল এটির কমান্ড লাইন আর্গুমেন্ট হিসাবে স্ট্যান্ডার্ড ইনপুট দিয়ে তার আদেশগুলি গ্রহণ করে । এটি কোনও স্ক্রিপ্টে ব্যবহার করার সময়, এটি যুক্ত করার স্বাভাবিক উপায় হ'ল পাইপ কমান্ডগুলি ব্যবহার করা:exedexprintf

printf "%s\n" "g/pattern/d" w | ed -s filename

বা একটি বংশগত সঙ্গে:

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