বাশ: স্ট্যান্ডআউটে সর্বশেষ (বা Nth) লাইন ক্যাপচার / ব্যবহার করুন


11

প্রশ্ন

আমি ব্যাশ ব্যবহার করি যখন আমি ফাইলগুলি সন্ধান করি, প্রায়শই আমি নিম্নলিখিতগুলি করতাম:

find -name stackexchange.hs

এবং প্রায়শই ফলাফলগুলি এর মতো দেখাবে:

/youre/the/man/now/dog/stackexchange.hs
/you/are/no/longer/the/dog/dog/stackexchange.hs
/this/is/the/file/i/want/stackexchange.hs

তারপরে আমি নিম্নলিখিতগুলির একটি করতে চাই:

  • বিকল্প 1: ভিএম ফলাফলের তালিকার শেষ আইটেমটি খুলুন ।
  • অপশন 2: ফলাফল তালিকায় খুলুন N তম আইটেমটি তেজ

বর্তমানে, আমি মাউস দিয়ে কাট-পেস্ট করছি। যা আমার প্রশ্নে নিয়ে আসে :

  1. 1 এবং 2 বিকল্পগুলি সম্পন্ন করার জন্য কি কোনও সহজ, ওয়ান-লাইনার রয়েছে? নোট করুন যে কমান্ডের পরে এটি ঘটছে find
  2. কোনও ধরণের ব্যাশ ভেক্টর / অ্যারেতে স্টডআউট থেকে এন-লাইনগুলি ক্যাপচার করার কোনও উপায় আছে কি?

আদর্শ ব্যবহার usage

$ find -name am_i_really_all_alone.txt
./borges/library/you_are_not_alone.txt
./borges/library/am_i_really_all_alone.txt
$ vim (N)

(বাক্য গঠন এবং শব্দার্থবিজ্ঞান পৃথক হতে পারে, তবে আপনি পয়েন্টটি পাবেন)

Similaria

বেশ কয়েকটি অনুরূপ প্রশ্ন রয়েছে বলে মনে হচ্ছে। এখানে আমার অনুভূতিগত পার্থক্য রয়েছে (আমি আলোকিত হওয়ার জন্য উন্মুক্ত):

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


আমি মনে করি, আপনি যদি শেষ ফলাফলটি খুলতে চান তার আগে যদি আপনি এটি জানেন তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন vim $(command |tail -n1)
ওয়ারেস

আমি এখানে অনুরূপ প্রশ্ন পোস্ট করেছি ইউনিক্স.স্ট্যাকেক্সেঞ্জার.কম
সেকশনস /

উত্তর:


8

এখানে আপনার সমস্যার একটি সম্ভাব্য সমাধান যা ফানকি ফাইলের নামগুলির উপস্থিতিতে যুক্তিসঙ্গতভাবে (তবে পুরোপুরি নয়) নিরাপদ হওয়া উচিত (এতে লাইনফিডগুলির সাথে ফাইলের নামগুলি হ্যান্ডেল করে না - সম্ভবত সংশোধনযোগ্য, তবে অন্যান্য সমস্যা লুকিয়ে থাকতে পারে)।

দুটি ফাংশন, প্রথমটি findআপনি যে প্যারামিটারগুলি দিয়েছিলেন তা দিয়ে চালায় , একটি অ্যারেতে আউটপুট সংরক্ষণ করে এবং তাদের প্রদর্শন করে। দ্বিতীয়টি সেই অ্যারে অ্যাক্সেস করার জন্য কেবল সহায়ক।

myfind() {
  IFS=$'\n' __last_find_result=($(find "$@"));
  printf "%s\n" "${__last_find_result[@]}";
}
myget() {
  echo "${__last_find_result[$1]}";
}

ব্যবহারের ক্ষেত্রে:

$ myfind . -name "c*"
./a b/c d
./.git/config
./.git/hooks/commit-msg.sample
$ vim "$(myget 0)"
# This opens the "./a b/c d" file.
$ vim "$(myget 2)"
# This opens ".git/hooks/commit-msg.sample"

$(myget index)আপনার যদি আপনার ফাইলের নামগুলিতে শ্বেতক্ষেত্র বা অন্যান্য ঝামেলাযুক্ত অক্ষর না থাকে তবে চারপাশে কোটের প্রয়োজন হয় না। আপনার পরিবেশের
পুরো আউটপুটটি পুশ করে find, এটি সীমাবদ্ধ হতে পারে। (অ্যারের পরিবর্তে অস্থায়ী ফাইল ব্যবহার করা এটি সমাধান করবে তবে এর মধ্যে অন্যান্য সমস্যা রয়েছে - একাধিক শেল থেকে উল্লেখযোগ্যভাবে সমবর্তী ব্যবহার))


1
আমি আপনাকে উজ্জীবিত করতে পারি না কারণ আমার যথেষ্ট খ্যাতি নেই, সুতরাং এখানে একটি, উহ,
মৌখিকটি রয়েছে

6

আমি এটি আমার পেয়েছি .screenrc:

bind -c pasteline 1 eval copy 'stuff "-Y"' 'paste .'
bind -c pasteline 2 eval copy 'stuff "2-Y"' 'paste .'
bind -c pasteline 3 eval copy 'stuff "3-Y"' 'paste .'
bind -c pasteline 4 eval copy 'stuff "4-Y"' 'paste .'
bind -c pasteline 5 eval copy 'stuff "5-Y"' 'paste .'
bind -c pasteline 6 eval copy 'stuff "6-Y"' 'paste .'
bind -c pasteline 7 eval copy 'stuff "7-Y"' 'paste .'
bind -c pasteline 8 eval copy 'stuff "8-Y"' 'paste .'
bind -c pasteline 9 eval copy 'stuff "9-Y"' 'paste .'
bindkey ¬ command -c pasteline

মূলত, স্ক্রিনে, ¬1কার্সারের উপরে লাইনটি আটকে দেয়,¬2 আটকায়, কার্সরের উপরে দ্বিতীয় লাইনটি আটকায় ... ইত্যাদি on আপনি 10 এবং উপরের রেখাগুলির জন্য আরও যোগ করতে চাইতে পারেন, তবে আমি দেখতে পেয়েছি যে প্রায় 7 এর পরে, আমি চাইলে screenলাইনের সংখ্যা গণনা করার চেয়ে আমি মাউস বা অনুলিপি মোডটি ব্যবহার করব।


0

আর একটি সমাধান হ'ল: আপনি একটি ইন্টারেক্টিভ স্ক্রিপ্ট লিখতে পারেন যা স্বয়ংক্রিয়ভাবে আপনার পছন্দ চাইবে। ইন্টারেক্টিভ স্ক্রিপ্টের জন্য কোড এখানে:

#!/bin/bash

echo "enter your choice : z for last argument or a number for that file"
read choice

case "$choice" in
z) eval vim \$$#;;
*)eval  vim \$$choice;;
esac

এই স্ক্রিপ্টটিকে যে কোনও নামে "স্বতঃআপনি" বলুন এবং সংরক্ষণ করুন স্ক্রিপ্টটি আপনার "ফাইন্ড কমান্ড" দিয়ে আর্গুমেন্ট হিসাবে অনুরোধ করুন এখানে স্ক্রিপ্ট আহ্বানের কোড:

./autofind `your find command`

তবে স্ক্রিপ্টটি ব্যবহারের আগে আপনার "ফাইন্ড কমান্ড" পরীক্ষা করে দেখুন যে এটি ফলাফল দিচ্ছে কি না it যদি এটি কোনও ফলাফল দেখায় তবে কেবল স্ক্রিপ্টটি ব্যবহার করুন


0

ম্যাটস উত্তরটি ঠিক আমি যা খুঁজছিলাম was আরও গেট-বিকল্পের জন্য আমি তার কোডটি কিছুটা প্রসারিত করেছি।

$ f ~/scripts -name '*.sh'
$ vim $(g foo)  # edit all find results matching "foo"
$ vim $(g 1 3 5) # edit find results number 1, 3 and 5
$ vim $(g 3-5) # edit find results 3-5
$ vim $(g 5-) # edit find results 5 to last
$ vim $(g -7) # edit find result 7 from bottom
$ vim $(g 1 4-5 -7 9- foo) # all of the above combined

f() {
    IFS=$'\n' __last_find_result=($(find "$@"));
    printf "%s\n" "${__last_find_result[@]}";
}

g() {
    len=${#__last_find_result[@]}
    pad=${#len}
    numbers=""
    if [ "$1" == "-n" ]; then
        numbers=1
        shift
    fi
    if [ -z "$1" ]; then
        if [ -n "$numbers" ]; then
            n=1;
            for e in "${__last_find_result[@]}";do
                printf "%0${pad}d. %s\n" "$n" "$e"
                let n=n+1
            done
        else
            printf "%s\n" "${__last_find_result[@]}"
        fi
    else
        for l in $@;do
            if [[ "$l" =~ ([^0-9-]+) ]];then
                n=1;
                for e in "${__last_find_result[@]}";do
                    if [[ $e =~ $1 ]]; then
                        if [ -n "$numbers" ];then
                            printf "%0${pad}d. %s\n" "$n" "$e"
                        else
                            printf "%s\n" "$e"
                        fi
                    fi
                    let n=n+1
                done
            elif [[ "$l" =~ ^([0-9]+)$ ]];then
                let l=l-1
                echo "${__last_find_result[$l]}";
            elif [[ "$l" =~ ^([0-9]*)(-)?([0-9]*)$ ]]; then
                from=${BASH_REMATCH[1]};
                dash=${BASH_REMATCH[2]};
                to=${BASH_REMATCH[3]};
                if [ -z "$from" ]; then # -n
                    [ $to -gt ${#__last_find_result[@]} ] && to=${#__last_find_result[@]}
                    echo "${__last_find_result[-$to]}";
                else # n-m
                    [ -z "$to" ] && to=${#__last_find_result[@]}
                    [ $to -gt ${#__last_find_result[@]} ] && to=${#__last_find_result[@]}
                    let to=$to-1
                    let from=$from-1
                    n=$(($from+1))
                    for i in `seq $from $to`;do
                        if [ -n "$numbers" ];then
                            printf "%0${pad}d. %s\n" "$n" "${__last_find_result[$i]}"
                        else
                            printf "%s\n" "${__last_find_result[$i]}"
                        fi
                        let n=n+1
                    done
                fi
            fi
        done
    fi
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.