একটি নির্দিষ্ট স্ট্রিং রয়েছে এমন কোনও পাঠ্য ফাইলে সমস্ত লাইন মুছতে আমি কীভাবে সেড ব্যবহার করব?
একটি নির্দিষ্ট স্ট্রিং রয়েছে এমন কোনও পাঠ্য ফাইলে সমস্ত লাইন মুছতে আমি কীভাবে সেড ব্যবহার করব?
উত্তর:
লাইনটি সরাতে এবং আউটপুটটিকে স্ট্যান্ডার্ড আউট প্রিন্ট করতে:
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
sed '/pattern to match/d' ./infile > ./newfile
বা যদি আপনি কোনও স্থান-সম্পাদনা করতে চান তবে আপনি -i
পতাকাটি সিডে যুক্ত করতে পারেন sed -i '/pattern to match/d' ./infile
। নোট করুন যে -i
পতাকাটির জন্য GNU
sed -i.backup '/pattern to match/d' ./infile
) এটি আমাকে ইন-প্লেস সম্পাদনাগুলি সহ পেয়ে গেছে।
sed
সংস্করণ-নিয়ন্ত্রিত নয় এমন কোনও ফাইলের মতো কমান্ড প্রয়োগ করবেন না ।
sed -i '' '/pattern/d' ./infile
।
নির্দিষ্ট স্ট্রিং সহ লাইনগুলি মুছে ফেলার আরও অনেক উপায় রয়েছে sed
:
awk '!/pattern/' file > temp && mv temp file
ruby -i.bak -ne 'print if not /test/' file
perl -ni.bak -e "print unless /pattern/" file
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
sed
উদাহরণস্বরূপ একটি ভিন্ন আচরণ আছে, এটি শুধুমাত্র greps! এটা কিছু হতে হবে sed -n -i '/pattern/!p' file
।
grep -v "pattern" file > temp; mv temp file
এটি প্রত্যাবর্তনের মানের উপর নির্ভর করে অন্য কয়েকটি উদাহরণের জন্য প্রয়োগ হতে পারে।
seq -f %f 10000000 >foo.txt
। time sed -i '' '/6543210/d' foo.txt
সেড ডি: আসল 0 মি 9.294 সে। time sed -i '' -n '/6543210/!p' foo.txt
সেড ! পি: আসল 0 মি 13.671 সে। (ছোট ফাইলগুলির জন্য, পার্থক্যটি আরও বড়))
আপনি একটি ফাইলের জায়গায় লাইনগুলি প্রতিস্থাপন করতে সেড ব্যবহার করতে পারেন। যাইহোক, এটি একটি দ্বিতীয় ফাইলের মধ্যে বিপরীতটির জন্য গ্রেপ ব্যবহার করা এবং তারপরে দ্বিতীয় ফাইলটিকে আসল ওভারের চেয়ে অনেক ধীর বলে মনে হচ্ছে।
যেমন
sed -i '/pattern/d' filename
অথবা
grep -v "pattern" filename > filename2; mv filename2 filename
প্রথম কমান্ডটি যাইহোক আমার মেশিনে 3 গুণ বেশি সময় নেয়।
sed '/pattern/d' filename > filename2; mv filename2 filename
জিএনইউ সহ এটি করার সহজ উপায় sed
:
sed --in-place '/some string here/d' yourfile
-r
বিকল্পটি চেষ্টা করুন (বা -E
আপনার সংস্করণ অনুসারে)। এই Regex metacharacters ব্যবহার সক্ষম +
, ?
, {...}
এবং (...)
।
আপনি ব্যবহারটি বিবেচনা করতে পারেন ex
(যা একটি মান ইউনিক্স কমান্ড-ভিত্তিক সম্পাদক):
ex +g/match/d -cwq file
কোথায়:
+
প্রদত্ত প্রাক্তন কমান্ড ( man ex
) প্রয়োগ -c
করে যা কার্যকর করে wq
(লিখুন এবং প্রস্থান করুন)g/match/d
- প্রদত্ত সহ লাইনগুলি মুছে ফেলার জন্য প্রাক্তন কমান্ড match
, দেখুন: জি পাওয়ারউপরের উদাহরণটি ইউনিক্স.এসই এবং পোস্টের জন্য পসিএক্স স্পেসিফিকেশন ex
অনুসারে এই পোস্ট অনুসারে কোনও ফাইল সম্পাদনা করার জন্য একটি পসিক্স-সম্মতিজনক পদ্ধতি ।
এর সাথে পার্থক্যটি sed
হ'ল:
sed
একটি হল এস tream ইডি itor, না একটি ফাইল এডিটর। BashFAQ
আপনি যদি অপ্রয়োজনীয় কোড উপভোগ না করেন তবে I / O ওভারহেড এবং কিছু অন্যান্য খারাপ পার্শ্ব প্রতিক্রিয়া। সুতরাং মূলত কিছু প্যারামিটারগুলি (যেমন স্থানটিতে / -i
) অ-মানক ফ্রিবিএসডি এক্সটেনশান এবং অন্যান্য অপারেটিং সিস্টেমে উপলব্ধ নাও হতে পারে।
man ex
এটা আমার জন্য মানুষ দেয় vim
, মনে ex
তেজ অংশ ... যদি আমি ডান মানে প্যাটার্ন সিনট্যাক্স বোঝা match
হয় vimregex.com যা একই কিন্তু POSIX এবং PCRE স্বাদে আলাদা?
আমি ম্যাক নিয়ে এই নিয়ে লড়াই করে যাচ্ছিলাম। এছাড়াও, পরিবর্তনশীল প্রতিস্থাপন ব্যবহার করে আমার এটি করা দরকার।
সুতরাং আমি ব্যবহার করেছি:
sed -i '' "/$pattern/d" $file
যেখানে $file
ফাইল যেখানে মুছে ফেলার প্রয়োজন এবং হয় $pattern
প্যাটার্ন মুছে ফেলার জন্য মিলেছে করা হয়।
আমি ''
এই মন্তব্য থেকে চয়ন ।
এখানে খেয়াল করা জিনিস ব্যবহার উদ্ধৃতি চিহ্ন মধ্যে "/$pattern/d"
। পরিবর্তনশীল কাজ করবে না যখন আমরা একক উদ্ধৃতি ব্যবহার করি।
sed
পরে একটি প্যারামিটার প্রয়োজন -i
, সুতরাং আপনি যদি ব্যাকআপ না চান তবে আপনাকে এখনও একটি খালি স্ট্রিং যুক্ত করতে হবে:-i ''
sed -i "/$pattern/d" $file
। আপনার উত্তর করার জন্য আপনাকে ধন্যবাদ।
আমি একটি ফাইল দিয়ে একটি ছোট বেঞ্চমার্ক তৈরি করেছি যার মধ্যে প্রায় 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
perl -i -nle'/regexp/||print' file1 file2 file3
perl -i.bk -nle'/regexp/||print' file1 file2 file3
প্রথম কমান্ড ফাইল (গুলি) ইনপ্লেস (-i) সম্পাদনা করে।
দ্বিতীয় কমান্ড একই কাজ করে তবে ফাইলের নামের সাথে .bk যুক্ত করে মূল ফাইল (গুলি) এর একটি অনুলিপি বা ব্যাকআপ রাখে (.bk যে কোনও কিছুতে পরিবর্তন করা যায়)।
স্ট্রিংয়ের সঠিক ম্যাচের জন্য কেউ যদি এটি করতে চায় তবে আপনি পুরোপুরি -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 $.
cat filename | grep -v "pattern" > filename.1
mv filename.1 filename
কনসোলে চিকিত্সা করা পাঠ্যটি দেখানোর জন্য
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
একটি সময়ে এক পৃষ্ঠার খন্ডে টেক্সট প্রদর্শন করবে।
আপনি যে উত্তরটি ব্যবহার করেন সেটিরed
অনুরূপ ফাইলে কোনও ফাইল সম্পাদনা করতে ভাল পুরানো ব্যবহার করতে পারেন । এই ক্ষেত্রে বড় পার্থক্য হ'ল এটির কমান্ড লাইন আর্গুমেন্ট হিসাবে স্ট্যান্ডার্ড ইনপুট দিয়ে তার আদেশগুলি গ্রহণ করে । এটি কোনও স্ক্রিপ্টে ব্যবহার করার সময়, এটি যুক্ত করার স্বাভাবিক উপায় হ'ল পাইপ কমান্ডগুলি ব্যবহার করা:ex
ed
ex
printf
printf "%s\n" "g/pattern/d" w | ed -s filename
বা একটি বংশগত সঙ্গে:
ed -s filename <<EOF
g/pattern/d
w
EOF