গ্রেপ: ম্যান পৃষ্ঠা থেকে শিরোনামে শব্দগুলি অনুসন্ধান করার সময় অপ্রত্যাশিত ফলাফল results


19

ম্যাকোজে কোনও ম্যান পেজ গ্রেপ করার চেষ্টা করার সময় আমি অদ্ভুত আচরণে চলে আসছি। উদাহরণস্বরূপ, বাশ ম্যান পৃষ্ঠাতে স্পষ্টভাবে স্ট্রিংয়ের উপস্থিতি রয়েছে NAME:

$ man bash | head -5 | tail -1
NAME

এবং যদি আমি গ্রেপ করি তবে আমি nameফলাফল পেতে পারি, তবে যদি আমি গ্রেপ করি তবে NAMEআমি তা না করি:

$ man bash | grep 'NAME'
$ man bash | grep NAME

আমি জানি যে অন্য বড় হাতের শব্দগুলি সেখানে রয়েছে এবং আমি অনুসন্ধান SHELLকরেও ফলন পাইনিBASH ফলনকারীর ফলাফল ফলন ।

এখানে কি হচ্ছে?

আপডেট : সমস্ত উত্তরের জন্য ধন্যবাদ! আমি এই প্রসঙ্গে যে প্রসঙ্গে ছড়িয়েছি তা যুক্তিযুক্ত বলে মনে করেছি। আমি মোড়ানোর জন্য বাশ ফাংশন লিখতে চেয়েছিলাম manএবং যে ক্ষেত্রে আমি শেল বিল্টিনের জন্য ম্যান পৃষ্ঠাটি সন্ধান করার চেষ্টা করেছি, বাশ ম্যান পৃষ্ঠার প্রাসঙ্গিক বিভাগে ঝাঁপ দাও। আরও ভাল উপায় হতে পারে, তবে আমি বর্তমানে যা পেয়েছি তা এখানে:

man () {
  case "$(type -t "$1")" in
    builtin)
      local pattern="^ *$1"

      if bashdoc_match "$pattern \+[-[]"; then
        command man bash | less --pattern="$pattern +[-[]"
      elif bashdoc_match "$pattern\b"; then
        command man bash | less --pattern="$pattern[[:>:]]"
      else
        command man bash
      fi
      ;;
    keyword)
      command man bash | less --hilite-search --pattern='^SHELL GRAMMAR$'
      ;;
    *)
      command man "$@"
      ;;
  esac
}

bashdoc_match() {
  command man bash | col -b | grep -l "$1" > /dev/null
}


আপনি কোন অপারেটিং সিস্টেম ব্যবহার করছেন? আমি নিশ্চিত যে গৃহীত উত্তরটি সঠিক আছে তবে আইও আমার আর্ক লিনাক্স বাক্সে এটি পুনরুত্পাদন করতে পারে না। man bash | grep NAMEপ্রত্যাশার মতো কাজ করে।
টেরডন

@terdon আমি ম্যাকোজে আছি আমি বাশ 3.2 এবং 4.4.5
আইভান

যেমন একটি সরু: আপনি যদি কোনও বিল্টিন সনাক্ত করেন তবে আপনি কেবল helpতার তথ্য পেতে ব্যাশ কমান্ডটি ব্যবহার করতে পারেন ।
জো

@ জো সমস্যা হ'ল আমি প্রায়শই helpফলাফলগুলিকে খুব বেশি ছাড়তে দেখি । উদাহরণস্বরূপ, বিভাগটি help completeবনাম দেখুন । completeman bash
আইভান

উত্তর:


33

যদি আপনি | sed -n lসেই tailকমান্ডটিতে কোনও মুদ্রণযোগ্য অক্ষর প্রদর্শন করতে যোগ করেন তবে আপনি সম্ভবত এরকম কিছু দেখতে পাবেন:

N\bNA\bAM\bME\bE

অর্থাৎ প্রতিটি চরিত্র Xব্যাকস্পেস হিসাবে লেখা X। আধুনিক টার্মিনালগুলিতে, চরিত্রটি নিজের উপর লেখা হয় (ব্যাকস্পেস ওরফে বিএস ওরফে \bওরফে হিসাবে^H যেমন একটি চরিত্র যা কার্সারকে একটি কলামকে বাম দিকে নিয়ে যায়) কোনও পার্থক্য ছাড়াই। তবে প্রাচীন টেলি-লেখকগুলিতে, দ্বিগুণ কালি পাওয়ার সাথে সাথে চরিত্রটি সাহসী দেখা দেয়।

তবুও, পেজাররা সাহসী বোঝার জন্য সেই বিন্যাসটিকে পছন্দ করে more/ পছন্দ করে lessতাই এটি এখনওroff বোল্ড টেক্সট আউটপুট দেয়।

কিছু লোক বাস্তবায়ন roffএমনভাবে কল করবে যে সেই ক্রমগুলি ব্যবহার করা হয়নি (বা অভ্যন্তরীণভাবে প্রয়োগের col -b -p -xক্ষেত্রে তাদের মতো ফালা ফলের জন্য কল করুন man-db( MAN_KEEP_FORMATTINGপরিবেশের পরিবর্তনশীল সেট না করা থাকলে)) এবং আউটপুট সনাক্ত করার সময় কোনও পেজারকে অনুরোধ করবেন না একটি টার্মিনাল যাচ্ছে না (তাইman bash | grep NAME সেখানে কাজ করবে) তবে আপনার নয়।

আপনি col -bএই সিকোয়েন্সগুলি সরিয়ে ফেলতে ব্যবহার করতে পারেন ( আন্ডারলাইনের পাশাপাশি অন্যান্য ধরণের ( _BS X) রয়েছে)।

জিএনইউ roff(যেমন জিএনইউ বা ফ্রিবিএসডি) ব্যবহার করে এমন সিস্টেমে , -c -b -uবিকল্পগুলি পাস হয়েছে কিনা তা নিশ্চিত করে আপনি প্রথম স্থানটিতে এই সিকোয়েন্সগুলি এড়াতে পারবেন grotty, উদাহরণস্বরূপ -P-cbuবিকল্পগুলি পাস হয়েছে কিনা তা নিশ্চিত করে groff

উদাহরণস্বরূপ একটি র‌্যাপার স্ক্রিপ্ট তৈরি করে যার মধ্যে groffরয়েছে:

#! /bin/sh -
exec /usr/bin/groff -P-cbu "$@"

আপনি / usr / bin / groff এর আগে রেখেছেন $PATH

ম্যাকোস ' man(এছাড়াও জিএনইউ ব্যবহার করে roff) এর সাহায্যে আপনি এগুলি তৈরি করতে পারেন man-no-overstrike.conf:

NROFF /usr/bin/groff -mandoc -Tutf8 -P-cbu

এবং কল করুন man:

man -C man-no-overstrike.conf bash | grep NAME

তবুও জিএনইউ দিয়ে roff, যদি আপনি GROFF_SGRপরিবেশের পরিবর্তনশীল সেট করেন (বা GROFF_NO_SGRসংকলনের সময় ডিফল্টগুলি কীভাবে নির্ধারণ করা হয়েছে তার উপর ভিত্তি করে ভেরিয়েবলটি সেট না করে ), তবে grotty(যতক্ষণ না এটি -cবিকল্পটি পাস না করা হয় ) এর পরিবর্তে এএনএসআই এসজিআর টার্মিনাল এস্কেপ সিকোয়েন্সগুলি ব্যবহার করবে চরিত্র বৈশিষ্ট্যের জন্য এই বিএস কৌশলগুলি। অপশন lessসহ ডাকা হলে তাদের বুঝতে -R

FreeBSD 'র এর মানুষের কল grottyসঙ্গে -cবিকল্প যদি না আপনার জন্য বলছি রং MANCOLOR পরিবর্তনশীল (যেখানে ক্ষেত্রে সেটিং দ্বারা -cপ্রেরণ করা হয় না grottyএবং grottyANSI SGR পালাবার ক্রম সেখানে ব্যবহার ডিফল্ট নির্বাচনগুলি ফেরত্ পাওয়া যাবে)।

MANCOLOR=1 man bash | grep NAME

সেখানে কাজ করবে।

ডেবিয়ানে, জিআরওএফএফএসজিআরটি ডিফল্ট নয়। যদি তুমি করো:

GROFF_SGR=1 man bash | grep NAME

তবে, manস্টাডাউটটি টার্মিনাল নয়, এটি একটি GROFF_NO_SGRভেরিয়েবল পাস করার জন্য এটি নিজেই grottyনেমেছে (আমি মনে করি এটি এসএসআর সিকোয়েন্সগুলি কীভাবে স্ট্রিপ করতে জানে না col -bpxবিএস সিকোয়েন্সগুলি স্ট্রিপ করতে ব্যবহার করতে পারে col, যদিও এটি এখনও রয়েছে এটি দিয়ে MAN_KEEP_FORMATTING) যা আমাদের ওভাররাইড করে GROFF_SGR। পরিবর্তে আপনি এটি করতে পারেন:

GROFF_SGR=1 MANPAGER='grep NAME' man bash

(টার্মিনালে) এসজিআর এস্কেপ সিকোয়েন্সগুলি পেতে।

সে সময়, আপনি যে যারা কিছু বিজ্ঞপ্তি পাবেন NAME এর গুলি টার্মিনাল (এবং উপর গাঢ় দেখা না less -Rপেজার)। আপনি যদি আউটপুট sed -n l( MANPAGER='sed -n /NAME/l') এ ফিড করেন তবে আপনি এমন কিছু দেখতে পাবেন:

\033[1mNAME\033[0m$

কোথায় \e[1mANSI সামঞ্জস্যপূর্ণ টার্মিনাল মধ্যে সাহসী সক্ষম করতে ক্রম, এবং \e[0mক্রম ডিফল্ট সব SGR বৈশিষ্ট্যাবলী রূপে ফিরিয়ে নিয়ে যেতে।

সেই পাঠ্যটিতে সেই পাঠ্যটি grep NAMEযেমন কাজ করে তেমন কাজ করে NAMEতবে আপনার এখনও সমস্যা হতে পারে যদি পাঠ্যের সন্ধান করে যেখানে কেবলমাত্র তার কিছু অংশ সাহসী / আন্ডারলাইন রয়েছে ...


2
বাহ, সেখানে শারীরিক টেলি-টাইপের উত্তরাধিকারটি দেখতে বেশ আকর্ষণীয়। দ্বিগুণ কালি => সাহসী। নিখুঁত ধারণা তৈরি করে
ইভান

1
আমি sed -n lবিকল্প হিসাবে প্রেমময় od
টম হেল

13

আপনি যদি কোনও ম্যানুয়াল পৃষ্ঠা দেখেন তবে লক্ষ্য করুন যে শিরোনামগুলি গা bold়। এটি নিয়ন্ত্রণ অক্ষরের সাথে তাদের ফর্ম্যাট করার মাধ্যমে অর্জন করা হয়। আপনি যা grepচাইছেন তা করতে সক্ষম হতে , এগুলি সরিয়ে নিতে হবে।

colউপযোগ এই জন্য ব্যবহার করা যেতে পারে:

$ man bash | col -b | grep 'NAME'

-bবিকল্প নিম্নলিখিত বিবরণ নেই OpenBSD উপর :

কোনও ব্যাকস্পেস আউটপুট করবেন না, প্রতিটি কলাম পজিশনে কেবলমাত্র শেষ অক্ষরটি মুদ্রণ করবেন। এটি ম্যান্ডোকের আউটপুট প্রক্রিয়াজাতকরণে কার্যকর হতে পারে (1)।


লিনাক্স colম্যানুয়ালটিতে (উবুন্টুতে) সেখানে শেষ বাক্য নেই (তবে এটি একইভাবে কাজ করে)।

লিনাক্স এ, unsetting MAN_KEEP_FORMATTINGএনভায়রনমেন্ট ভেরিয়েবল (অথবা একটি খালি স্ট্রিং তা সেট করা) সাহায্যের এছাড়াও হতে পারে, এবং আপনার অনুমতি দেবে grepআউটপুট পাশ ছাড়া manমাধ্যমে col -b


আমি মনে করি (যেমন আমি এটি একটি আর্চ এবং একটি উবুন্টু সিস্টেমে পরীক্ষা করেছি) যে লিনাক্সে এটি প্রয়োজনীয় নয়, বা আর প্রয়োজন নেই। উভয় সিস্টেমে, NAMEব্যাশ ম্যানুয়ালটি ঠিক NAME, না \b
terdon

@terdon আমি প্রথমে ম্যাকোসের উল্লেখ উল্লেখ করিনি, সুতরাং আমি ধরেছিলাম যে একটি ভুলভাবে কনফিগার করা লিনাক্স সিস্টেমের সম্ভাবনা ছিল। আমি এখন লিনাক্স বিট ছাঁটাই করেছি।
কুসালানন্দ

আপনি কিছুই মিস করেন না, আমি ওপিকে জিজ্ঞাসা করেছি যে তারা ওএস কী ব্যবহার করছে কারণ আমি লিনাক্সে পুনরুত্পাদন করতে পারছি না, তারা বলেছে ম্যাকোস এবং আমি এখনই এটি যুক্ত করেছি। এবং আমি আপনাকে বোঝাচ্ছি না যে আপনি ভুল ছিলেন, কারণ আমি জানি সমস্তখানে লিনাক্স বিতরণ রয়েছে যেখানে MAN_KEEP_FORMATTINGভেরিয়েবল ঠিক যেমন বলে ঠিক তেমন কাজ করে। আমি কেবল উল্লেখ করতে চেয়েছিলাম যে এটি সবসময় হয় না।
টেরডন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.