परिसीमन बदलने वाला grep


12

किसी भी तरह से हम परिसीमन को बदल सकते हैं जो grep का उपयोग करता है?

मुझे लगता है, डिफ़ॉल्ट रूप से, grep \nसीमांकक के रूप में उपयोग करता है।


ऐसा लगता है कि यह SuperUser.com पर बेहतर होगा
मिच डेम्पसे

मैन पेज पढ़ें, देखें कि क्या ऐसा कोई विकल्प है (नहीं, मुझे विश्वास नहीं है कि वहाँ है)।
कास्कैबेल

मैंने पहले ही पढ़ लिया है। और नहीं, इसका कोई विकल्प नहीं है

@ ज़ोन: फिर यह न पूछें कि grep को कैसे बदलना है, यह पूछें कि जो आप करना चाहते हैं वह किसी और चीज़ से कैसे करें। उदाहरण के लिए, आप रिकॉर्ड विभाजक को perl ( $/) और 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;

वास्तव में, मेरे पास इस तरह का डेटा है, जो एक चर के अंदर संग्रहीत है: कुछ xxxxx yyyyyy @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ तो, मुझे लगता है कि यह संभव था: इको $ my_var | grep "कुछ" यह काम करता है, लेकिन जैसा कि मैं चाहता हूं, grep एक एकल लाइन के रूप में डेटा का गुच्छा लेता है, यही कारण है कि मैं इसे एक विशिष्ट चरित्र में बदलना चाहता हूं (यहाँ '@' है)

: तो फिर तुम इस तरह डालने की कोशिश कर सकतेecho $my_var | tr @ '\n' | grep blahblah
चे

मैंने इसे किया है, लेकिन, ऐसा लगता है कि शेल "सामग्री को निष्पादित करने के लिए" कोशिश कर रहा है: एस

2
आपको $my varश्वेत-रिक्त स्थान और newlines को संरक्षित करने के लिए चर को उद्धृत करना होगा , अर्थात echo "$my_var" | ...
mrucci

1

agrepएरिज़ोना विश्वविद्यालय से आप सीमांकक सेट करने के लिए अनुमति देता है। यह grep के लिए एक ड्रॉप-इन प्रतिस्थापन नहीं है; यह एक अलग एल्गोरिथ्म (अनुमानित grep) का उपयोग करता है, त्रुटियों तक मेल खा सकता है) और अलग-अलग पैटर्न सिंटैक्स है। लेकिन यह एक आसान उपकरण है।

दुर्भाग्य से, मुझे लगता है कि लाइसेंसिंग के मुद्दों के कारण, कई समान परियोजनाएं आई हैं 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
(१) जबकि इससे समस्या का समाधान हो सकता है, हम कुछ और स्पष्टीकरण देना चाहते हैं। उदाहरण के लिए, क्या d="${1}"केवल कहने के बजाय कहने का कोई वास्तविक कारण है d="$1"? (2) आपको अपनी चेतावनी का विस्तार करने की आवश्यकता है: यदि इसका उपयोग कई फ़ाइलों के साथ किया जाता है, तो आपको कोई समस्या है यदि किसी भी फ़ाइल नाम में @ @ ’हो। (3) (नाइट पिक) एक सच्चा "grep" प्रतिस्थापन / एमुलेटर भी शून्य फ़ाइल तर्क के साथ काम करेगा।
स्कॉट

1

शून्य-सीमांकक ('@') को grep से पहले एक नई रेखा (\ n) से बदलें:

बिल्ली फ़ाइल | tr '\ 00' '\ n' | grep "खोज-स्ट्रिंग"


0

यह कैसा है ? कोई उपयोग?

grep फ़ाइल "खोज-स्ट्रिंग" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {प्रिंट}'

अपनी जरूरत के हिसाब से '@' सेट करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.