কিভাবে একটি নতুন ভিআই ফাইলের মধ্যে গ্রেপ অনুসন্ধানের ফলাফলটি পাইপ করা যায়


63

আমি grep -e Peugeot -e PeuGeot carlist.txtcarlist.txt এর মাধ্যমে অনুসন্ধান করতে এবং কিছু আইটেম বের করতে ব্যবহার করছি এবং আমি অনুমান করেছি যে grep -e Peugeot -e PeuGeot carlist.txt | viএটি আমার জন্য পাইপ দেবে তবে আমি এটি পাই:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.

যদি আপনি একটি ফাইল অন্তর্ভুক্ত করতে চান, আমি ধারণা করতাম ফাইলে প্রথম ব্যবহারের ষষ্ঠ, এবং তারপর: :read !grep -e Peugeot -e PeuGeot carlist.txt। :read !cmd...সেমিডির আউটপুটটি ফাইলটিতে অন্তর্ভুক্ত করা হবে (কার্সারের অবস্থানে)
— অলিভিয়ার ডুলাক

এটি একটি "vi ফাইল" বলতে কী বোঝায় তা পরিষ্কার নয়। আপনি যদি আউটপুটটি কোনও ফাইলে যেতে চান তবে ব্যবহার করুন grep ... > /tmp/foo। আপনি && vi /tmp/fooযদি তত্ক্ষণাত সেই ফাইলটি সম্পাদনা করতে চান তবে আপনি শেষে যুক্ত করতে পারেন।
— LarsH

1
আসলে "vi ফাইল" বলে কিছুই নেই। viস্বেচ্ছাসেবী পাঠ্য ফাইলগুলিতে পরিচালনা করে; ফাইলগুলি তাদের সাথে সরাসরি যুক্ত নয় vi। (বা, যেমনটি আমি কেবল শিখেছি, এর বিষয়বস্তুগুলি পরিচালনা করার vi -কারণ ঘটবে ; এটি করে তবে সমস্ত সংস্করণ তা করে না ))vistdinvimvi
— কীথ থম্পসন

উত্তর:


111

যুক্তি হিসাবে '-' দিয়ে vi বা vim চালানো স্ট্যান্ডার্ড ইনপুট থেকে সম্পাদনা করার জন্য ফাইলটি পড়তে বাধ্য করে। অত: পর:

grep -e Peugeot -e PeuGeot carlist.txt | vi -

আপনার যা প্রয়োজন তা করবে


3
যে কেউ এটি দেখার জন্য, মনোযোগ: এটি থেকে প্রত্যাশা করে stdin। কিছু ক্ষেত্রে আপনাকে এ থেকে পুনঃনির্দেশ stderrকরতে হবে stdin, যেমন:valgrind my_file.out 2>&1 | vi -
— Ciro Costa

এটি অনুসন্ধানের হাইলাইটগুলি মুছে ফেলে
— এমডি। মহিউদ্দিন আহমেদ

3
@ এমডি.মহিউদ্দিন আহমদ, আপনি কীভাবে ভিমের অভ্যন্তরে grepঅনুসন্ধানের রঙিন (অ-ছাপি অক্ষর দ্বারা রচিত) রাখবেন? আপনি সর্বদাই একটি সার্চ করতে পারি না এ তেজ।
— ওয়াইল্ডকার্ড

আমি ভেবেছিলাম আমরা vim.org/scriptts/script.php?script_id=302 প্লাগইনটি vim এর মধ্যে যেতে পারি ।
— এমডি মহিউদ্দিন আহমেদ


11

এছাড়াও সিনট্যাক্স vim -ব্যবহার করে আপনি প্রক্রিয়া বিকল্প ব্যবহার করতে পারেন <(command), উদাহরণস্বরূপ:

vim <(echo This is example.)
vim <(cat /etc/hosts)

আরো দেখুন:


5

আউটপুট পুনর্নির্দেশটিও এর মতো ব্যবহার করা যেতে পারে:

vi <(grep ...)

এমনকি একাধিক কমান্ড আউটপুটগুলি পুনঃনির্দেশিত করা যেতে পারে, যেন এগুলি পৃথক ফাইলে সংরক্ষণ করা হয়েছে:

vim -d <(ls) <(ls -a)

1

ইন ~/bin/r:

#!/bin/sh
[ $# -eq 0 ] && set -- -;
exec vi -R "$@"

ইন ~/.vimrc:

:  au StdinReadPost * set buftype=nofile

তারপর:

ls |r
grep -e Peugeot -e PeuGeot carlist.txt | r

এবং আমি পেয়েছি

r- () { "$@" | r; }

আমার ~/.bashrc,তাই

r- ls -l

0

আপনি যা চান তা করার অনেক কার্যকর উপায় রয়েছে, হয় vi (মি) বা বাইরের vi (m) এর মধ্যে।

আপনার আদেশটি চালান, একটি (অস্থায়ী) ফাইল তৈরি করুন, তারপরে ফাইলটি সম্পাদনা করুন ( জোসেফ আর এর উত্তর দেখুন )

grep -e"Peu[gG]eot" carlist.txt && vi /tmp/peugeot.txt

একটি অস্থায়ী ফাইল তৈরি করতে আপনার কমান্ডটি (পটভূমিতে) চালান এবং ": e" ব্যবহার করে ফাইলটি সম্পাদনা করুন! আপনার ফাইলটি তৈরি হওয়ার সাথে সাথে রিফ্রেশ করার জন্য (এটি লগফাইলে এবং অন্যান্য ফাইলগুলি যেমন অন্য ক্রস দ্বারা উত্পাদিত হচ্ছে যেমন ক্রোন?),

grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt &
vi /tmp/peugeot.txt

অস্থায়ী ফাইল তৈরি করতে একটি শিশু প্রক্রিয়া চালান, এবং তারপরে এটি পড়ুন,

vi
:!grep -e "Peu[gG]eot" carlist.txt > /tmp/peugeot.txt
:r /tmp/peugeot.txt

অথবা, কেবল ফাইলটিতে স্যুইচ করুন,

:e /tmp/peugeot.txt

Vi (এম) চালান, এবং ডাবল-ব্যাং ব্যবহার করুন "!!" চাইল্ড কমান্ডটি চালানোর জন্য, ফলাফলগুলি গ্রহণ করে এবং বর্তমান স্থানে সন্নিবেশ করানো (বর্তমান লাইনটি ওভাররাইট করে, সুতরাং আপনার ফাঁকা রেখা রয়েছে তা নিশ্চিত করুন),

vi
i
here
empty
there
<esc>
kk
!!grep -e "Peu[gG]eot" carlist.txt

এবং এখন আপনি যে কোনও ফাইলের কাছে ফাইলটি (যদি আপনি চান) লিখতে পারেন,

:w /tmp/someotherfilename.txt

এবং পেটর উজেলের উত্তরও ভাল,

grep -e "Peu[gG]eot" carlist.txt | vi -

যা স্টিডিন থেকে পড়েছে reads

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