গ্রেপ ডিলিমিটার পরিবর্তন করে


12

কোনওভাবেই আমরা গ্রেপ্তার ব্যবহার করে এমন সীমানা পরিবর্তন করতে পারি?

আমি মনে করি, ডিফল্টরূপে, গ্রেপ \nডিলিমিটার হিসাবে ব্যবহার করে।


এটির মতো শোনাচ্ছে এটি সুপার ইউজার ডট কম-এ আরও উপযুক্ত হবে
মিচ ডেম্পসে

ম্যান পৃষ্ঠাটি পড়ুন, দেখুন এই জাতীয় কোনও বিকল্প আছে কিনা (না, আমি বিশ্বাস করি না সেখানে রয়েছে)।
ক্যাসকেবেল

আমি ইতিমধ্যে এটি পড়েছি। এবং না, কোনও বিকল্প নেই

@ ঝাঁ: তারপরে গ্রেপ কীভাবে পরিবর্তন করবেন তা জিজ্ঞাসা করবেন না, অন্য কিছু দিয়ে আপনি কী করতে চান তা কীভাবে করবেন তা জিজ্ঞাসা করবেন না। উদাহরণস্বরূপ, আপনি পার্ল ( $/) এবং awk ( RS) এ রেকর্ড বিভাজক নির্দিষ্ট করতে পারেন । অথবা আপনি কিছু করতে পারে echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>। আপনার আসল সমস্যাটি কী তার উপর নির্ভর করে অনেকগুলি উত্তর।
ক্যাসকেবেল

উত্তর:


2

এটি আপনি কেবল আউটপুট সম্পর্কে যত্নশীল trআপনার জন্য কাজ করতে পারে:

che@nok ~ $ grep cpu /proc/cpuinfo | tr '\n' ';'
cpu family      : 6;cpu MHz             : 800.000;cpu cores     : 2;cpuid level : 10;cpu family : 6;cpu MHz : 800.000;cpu cores      : 2;cpuid level : 10;

প্রকৃতপক্ষে, আমার কাছে এই জাতীয় অনেকগুলি ডেটা রয়েছে, একটি ভেরিয়েবলের ভিতরে সঞ্চিত: কিছু এক্সএক্সএক্সএক্সএক্সএক্সএইচআই @ আআআআআআআআআআ বি বিবিবিবি @ এসডাস্ড @ এসএসডিএ @ অ্যাস্ডস ... @ সুতরাং, আমি যদি এটি সম্ভব হত তবে অনুমান করছিলাম: প্রতিধ্বনি $ আমার_ভার | গ্রেপ "কিছু" এটি কাজ করে, তবে আমি যেমন চাই না, গ্রেপ একক লাইন হিসাবে ডেটা গুচ্ছ নেয়, সে কারণেই আমি এটিকে একটি নির্দিষ্ট চরিত্রে পরিবর্তন করতে চাই (এখানে '@')

তারপরে আপনি এটি এটিকে দেওয়ার চেষ্টা করতে পারেন:echo $my_var | tr @ '\n' | grep blahblah
চে

আমি এটি করে ফেলেছি, তবে, মনে হচ্ছে শেলটি সামগ্রী চালানোর জন্য "চেষ্টা" করছে: এস

2
$my varসাদা স্পেস এবং নিউলাইনগুলি সংরক্ষণ করার জন্য আপনাকে ভেরিয়েবলটি উদ্ধৃত করতে হবে , অর্থাৎ echo "$my_var" | ...
মুর্চি

1

agrepঅ্যারিজোনা বিশ্ববিদ্যালয় থেকে আপনি ডিলিমিটার সেট করতে পারবেন। এটি গ্রেপের পরিবর্তে কোনও ড্রপ-ইন নয়; এটিতে একটি পৃথক অ্যালগরিদম ব্যবহার করা হয় (আনুমানিক গ্রেপ, ত্রুটির সাথে মিলতে পারে) এবং এতে আলাদা প্যাটার্ন সিনট্যাক্স থাকে। তবে এটি একটি সহজ সরঞ্জাম।

দুর্ভাগ্যক্রমে, আমি মনে করি লাইসেন্স সংক্রান্ত সমস্যার কারণে এখানে একাধিক অনুরূপ প্রজেক্ট আহ্বান করা হয়েছে agrep, এবং সেগুলি সবগুলি সুসংগত নয়। তবে আমি মনে করি সমস্ত সংস্করণ আপনাকে একটি ডিলিমিটার সেট করার অনুমতি দেয়।


1
case $# in
0|1|2)  cat >&2 <<EOF
    Usage: $0 delimiterstring pattern files....
    Behaves like grep -pdelimiterstring but on linux
    DOES NOT SUPPORT MOST ARGUMENTS
    unlike grep -p - leaves delimiterstring in output

    NO -p just the delimeterstring
    note: delimiterstring has to work in the sed command where the ${d} is
    if you are going to use @ in the delimeter string, then the @'s
    need to be replaced by someother character

EOF
    exit 0
;;
3)  mode=one ;;
*)  mode=many ;;
esac
d="${1}"
p="${2}"
shift 2
while [ $# -gt 1 ]
do
    sed "s@${d}@\x00@g" "${1}" | grep -z  "${p}" -  | (
        case $mode in 
        many) sed -e "s@\x00@${d}@g"  -e "s@^@${1}: @" ;;
        *)    sed -e "s@\x00@${d}@g"  ;;
        esac
    )
    shift
done

1
(1) যদিও এটি সমস্যার সমাধান করতে পারে, আমরা উত্তরগুলিকে আরও কিছুটা ব্যাখ্যা করতে পছন্দ করি। উদাহরণস্বরূপ, ন্যায়বিচারের d="${1}"পরিবর্তে বলার কোনও সত্য কারণ আছে d="$1"? (২) আপনার সতর্কতাটি প্রসারিত করতে হবে: এটি যদি একাধিক ফাইলের সাথে ব্যবহৃত হয় তবে ফাইলের নামের মধ্যে `@ 'থাকলে আপনারও সমস্যা আছে। (3) (নীট পিক) একটি সত্য "গ্রেপ" প্রতিস্থাপন / এমুলেটর শূন্য ফাইল আর্গুমেন্টের সাথেও কাজ করবে।
স্কট

1

গ্রেপের আগে একটি নতুন লাইন (del n) দিয়ে শূন্য-ডিলিমিটার ('@') প্রতিস্থাপন করুন:

বিড়াল ফাইল | tr '\ 00' '\ n' | গ্রেপ "অনুসন্ধানের স্ট্রিং"


0

এটা কেমন ? কোন ব্যবহার?

গ্রেপ ফাইল "অনুসন্ধান-স্ট্রিং" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {মুদ্রণ}'

আপনার প্রয়োজন অনুসারে যাই হোক না কেন '@' সেট করুন।

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