গ্রেপ থেকে ফলস্বরূপ আমি কীভাবে একটি ফাইল খুলতে পারি?


17

আমি প্রায়শই একটি লাইন খোঁজার জন্য গুচ্ছ ফাইলগুলিকে গ্রেপ করি এবং তারপরে গ্রেপ একটি ফলাফল দেয়। নতুন কমান্ডে ফাইলের নাম অনুলিপি করা ও আটকে দেওয়ার পরিবর্তে আমি সম্পাদকের সাহায্যে সেই ফলাফলটি খুলতে সক্ষম হতে চাই। ভালো কিছু: grep foo | vim। বাসে এটি করার কোনও উপায় আছে?


5
আপনি বরং কাছাকাছি ছিলেন, কেবল vimপড়তে বলুন STDIN:grep foo | vim -
ডিভনুল

উত্তর:


20

ব্যবহারের grep -lশুধু ম্যাচিং ফাইল এবং ম্যাচিং লেখার ফাইলের নাম পান, তারপরে সঙ্গে এটি একত্রিত vim:

vim "$(grep -l some_pattern file_names)"

অতিরিক্ত, আপনি -qgrepgrep -q patterns fnames && vim $(grep -l pattern fnames)
গ্রেপ

স্পেস সহ ফাইল নামগুলি সম্পর্কে আমার কি মন্তব্য করা উচিত?
বার্নহার্ড

@ বার্নহার্ড এটি কখনই আঘাত করতে পারে না, এবং নিউলাইন এবং অন্যান্য বিশেষ চরিত্রগুলি নিয়েও। অভিযোগ করার সময় আমি সমস্যাটি চিনতে পারিvi , ওপি নাও পারে।
অ্যান্থন


5

আপনি এতে quickfixবা errorfileবৈশিষ্ট্যগুলি ব্যবহার করতে পারেন vim:

$ grep -n foo * > /tmp/foo.list
$ vim -q /tmp/foo.list

ভিম প্রথম ফাইলটি খুলবে /tmp/foo.listএবং কার্সারটি সরাসরি যে লাইনে fooপাওয়া গিয়েছিল সেখানেই রাখবে । আপনি পরবর্তী উদাহরণগুলিতে :cnএবং পূর্ববর্তী উদাহরণ ব্যবহার করে যেতে পারেন :cp

পার্শ্ব নোট : আপনি যদি ইতিমধ্যে ব্যবহার করছেন vimবা gvim, তবে আমি এর ইনবিল্ট grepকার্যকারিতাটি ব্যবহার করার পরামর্শ দেব । :help vimgrepআরও তথ্যের জন্য পড়ুন ।


1

প্রকল্পের সন্ধানের জন্য পলাতক সহ ভীম ছাড়ার দরকার নেই

autocmd QuickFixCmdPost *grep* cwindow

নীচে আপনি উদাহরণ দেখতে পারেন :Ggrep config

এখানে চিত্র বর্ণনা লিখুন


0

সম্পাদনা: আপনার মন্তব্য পড়ার পরে, আমি বুঝতে পারি যে আমি প্রশ্নটি প্রথমে বুঝতে পারি নি। এখানে একটি সরল স্ক্রিপ্ট যা আপনার অনুসন্ধান শব্দটিকে একটি যুক্তি হিসাবে গ্রহণ করে এবং অনুসন্ধানের পথে অনুরোধ করে। যদি ফলাফলটি কেবল একটি ফাইলে পাওয়া যায় তবে এটি অনুসন্ধান ফলাফলের স্থানে সম্পাদনা করার জন্য ফাইলটি খুলবে।

#!/bin/bash

SRCHTRM="$1"

read -p "Where to search: " SRCHPATH

FILEFOUND=$(grep "$SRCHTRM" $SRCHPATH)
FILEFOUNDCNT=$(grep "$SRCHTRM" $SRCHPATH | wc -l)

FILEAWK=$(echo "$FILEFOUND" | awk -F":" '{ print $1 }')

if [ "$FILEFOUNDCNT" -eq "1" ];then
    vi +/"$SRCHTRM" "$FILEAWK"
else
    echo "$1 was found in more than one file"
fi

তবে এটি আমাকে গ্রেপের আউটপুট সম্পাদনা করার অনুমতি দেবে বলে মনে হয়, তবে আমি যা করতে চাই তা হ'ল ফাইল নাম দিয়ে ফাইলটি সম্পাদনা করে যা গ্রেপ দেয়।
জোনাথন

0

@ দেবনুল এই মন্তব্যে উত্তরটি পেয়েছেন:

আপনি বরং কাছাকাছি ছিলেন, কেবল স্ট্রিম থেকে পড়তে ভিমকে বলুন:

grep foo | vim -


0

আপনার একাধিক ম্যাচ রয়েছে এমন মামলার জন্য অ্যান্থনের উত্তরের প্রসারিত করতে, কেবলমাত্র প্রথম ফলাফলটি বেছে নিতে কিছু ক্ষেত্রে এটি ব্যবহার করা head -1( এই উত্তর থেকে ) সহায়ক হতে পারে :vim "$(grep -l STRING FILES|head -1)"


0

আপনি যদি একটি দীর্ঘ কমান্ড সম্পাদন করে থাকেন যা মাঝখানে কোথাও গ্রেপ হয়েছে তবে আপনি এটি করতেও পারেন

vim `command1 | grep whatever | awk '{do_something_else}'`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.