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


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.