स्ट्रिंग के मिलान के साथ स्ट्रिंग पैटर्न की सभी घटनाओं को कैसे प्रतिस्थापित किया जाए यह उस क्रम पर निर्भर करता है जो तार पाए गए थे

Nov 25 2020

मुझे एक बैश स्क्रिप्ट की आवश्यकता है जो किसी भी स्ट्रिंग को अंदर <>खोजती है, अगर यह एक ऐसा है जो इसे पहले नहीं मिला है तो इसे इंडेक्स काउंटर के वर्तमान मूल्य (शुरुआत में 0) से बदलना चाहिए और काउंटर को बढ़ाना चाहिए। यदि यह अंदर एक स्ट्रिंग पाता है <>जो पहले से ही जानता है, तो इसे स्ट्रिंग के सूचकांक को देखना चाहिए और इसे सूचकांक के साथ बदलना चाहिए। यह कई फ़ाइलों में किया जाना चाहिए, जिसका अर्थ है कि काउंटर को रीसेट नहीं किया जाता है जब कई फ़ाइलों को केवल स्टार्टअप पर पैटर्न के लिए खोजा जाता है

file_a.txt:

<abc>
<b>
<c>
<c>
<abc>

file_b.txt:

<c>
<b>

बन जाना चाहिए

file_a.txt:

0
1
2
2
0

file_b.txt:

2
1

मुझे अब तक क्या मिला:

names=()
for file in folder/*.txt
do
    name=$(sed 's/\<[a-zA-Z]*\> /\1 /' file) for i in "${names[@]}"
    do
        if [ "$i" -eq "$name" ]
        then
            #replace string with index of string in array
        else
            names+=("$name")
        fi
    done
done

संपादित करें: समस्या को सरल बनाने के लिए मैंने जो उल्लेख नहीं किया है, वह यह है कि जिस पैटर्न को प्रतिस्थापित किया जाना चाहिए वह फाइलों के अंदर का एकमात्र पाठ नहीं है, जिसका अर्थ है कि फाइलें इस तरह दिखती हैं:
file_a.txt:

123abc<abc>xyz
efg
<b>ah
a<c>
<c>b
c<abc>

file_b.txt:

xyz<c>xyz
xyz<b>xyz

बन जाना चाहिए

file_a.txt:

123abc0xyz
efg
1ah
a2
2b
c0

file_b.txt:

xyz2xyz
xyz1xyz

क्योंकि फाइलें काफी बड़ी हो सकती हैं, उन्हें कॉपी नहीं किया जाना चाहिए, केवल संपादित किया जाना चाहिए। यह एक फ़ोल्डर के अंदर सभी फ़ाइलों और सबफ़ोल्डर में फ़ाइलों के लिए किया जाना चाहिए

जवाब

3 anubhava Nov 25 2020 at 03:10

आप इस awk स्क्रिप्ट की कोशिश कर सकते हैं:

mkdir -p tmp

awk 'match($0, /<[^>]+>/) { k = substr($0, RSTART, RLENGTH)
   if (!(k in freq))
      freq[k] = n++
   $0 = substr($0, 1, RSTART-1) freq[k] substr($0, RSTART+RLENGTH) } { print $0 > ("tmp/" FILENAME)
}' file_{a,b}.txt

संशोधित फ़ाइलों को tmp/निर्देशिका में सहेजा जाएगा और आप उनकी सामग्री की जांच करने के बाद उन्हें वापस ले जा सकते हैं।

cat tmp/file_a.txt

123abc0xyz
efg
1ah
a2
2b
c0

cat tmp/file_b.txt

xyz2xyz
xyz1xyz