Unix / Linux regex के साथ मिलान ()


0

मेरे पास नाम के साथ कुछ युगल फाइलें हैं

(a).1
(a).2
...
(a).100

चूंकि बहुत सारे प्रसंस्करण उपकरण वास्तव में पसंद नहीं करते हैं (और )फ़ाइल नाम में मैंने उन्हें एक अलग नाम पर नाम देना बेहतर समझा। मैं फ़ाइलों का नाम बदलने के लिए googled और अद्भुत उपकरण पाया renameजहां मैं एक नियमित अभिव्यक्ति फ़ीड कर सकते हैं। ठीक है, आइए इसे आज़माएँ:

$ rename -v s/\(a\)/b/ \(a\).* 

(a).1 renamed as (b).1
(a).2 renamed as (b).2
(a).3 renamed as (b).3

हम्म वो नहीं जिसकी मुझे उम्मीद थी। थोड़ी गुगली के बाद मैंने पाया कि \( \)एक ग्रुपिंग ऑपरेटर है । किस तरह की समझदारी है क्योंकि मैं ( )कमांड में नहीं बचता ।

.सभी प्रकार के मूल्यों से मेल खाने वाले चरित्र का उपयोग करके मैंने अपनी नाम बदलने की समस्या को हल किया :

rename -v s/.b./b/ \(b\).*

यह समाधान वास्तव में अच्छा नहीं है। तो मैं कैसे मिलान (और )बैश / लिनक्स / यूनिक्स रेगेक्स में?


1
शायद गोल कोष्ठक के आसपास एकल उद्धरण का उपयोग करें? वैसे, मैं किसी भी परिणाम को पुन: प्राप्त करने में सक्षम नहीं था, जो आपको pastebin.com/raw.php?i=yhPgtvhG नाम बदलने की आज्ञा देता है, जब आप इसे चलाते हैं, तो मुझे एक त्रुटि मिलती है, और कुछ भी नहीं होता है जब मैं इसे बाहर निकालता हूं। बिट। यही कारण है कि cygwin में था कि हालांकि पार्टी अभी भी
barlop

मैंने LANG=en_US.UTF-8पर्यावरण के साथ डेबियन 8.0 का उपयोग किया । हो सकता है कि साइबरविन इनपुट के साथ कुछ अजीब काम करता हो। मैं regex को उद्धरणों में डालकर इसे हल करने में सक्षम था rename -v 's/\(a\)/a/' \(b\).*:।
पास्कल

यह भी हो सकता है कि Cygwin पर रेगेक्स हैंडलिंग लिनक्स की तुलना में अलग हो।
पास्कल

अगर मैं नाम बदलूँ -? यह कहता है कि rename [options] expression replacement file..आपको अभिव्यक्ति और प्रतिस्थापन मिल गया है लेकिन फ़ाइल नहीं। विकल्पों के बाद लगता है (जैसे -v) वहाँ 3 अनिवार्य पैरामीटर हैं, जो रिक्त स्थान द्वारा अलग किए गए हैं। लेकिन आपके नाम बदलें आदेश में केवल 2 हैं। मैं अपना नाम बदला संस्करण (- अपरकेस V)$ rename -V<ENTER> rename from util-linux 2.24.2
बार्लोप

मेरे पास है rename [ -h|-m|-V ] [ -v ] [ -n ] [ -f ] [ -e|-E *perlexpr*]*|*perlexpr* [ *files* ]। इसलिए हमारे पास दो अलग-अलग संस्करण हैं।
पास्कल

जवाबों:


1

यहाँ आपको क्या चाहिए:

find -name "(*)*" -type f | rename 's/\(|\)//g'

यह पहले वर्णित नाम से मेल खाते वर्तमान निर्देशिका में फ़ाइलें पाता है, फिर कोष्ठक को हटाकर उनका नाम बदल देता है। आप देख सकते हैं कि मिलान वाले वर्ण (और) को कुछ नहीं से बदल दिया गया है।


आह, मैं अपनी समस्या देखता हूं। मुझे rename 's/\(a\)/a/'इसके बजाय उपयोग करना चाहिए था rename s/\(a\)/a/। यहां क्या हो रहा है? आपने परिचय क्यों दिया find?
पास्कल

मुझे यह पसंद है क्योंकि आप कमांड का विस्तार करने के साथ-साथ कई अन्य चीज़ों को करने के लिए नाम बदलने के लिए फ़ाइलों की सूची का सत्यापन कर सकते हैं। एक स्विच है जो आपको परिवर्तनों को कार्रवाई किए बिना परीक्षण करने देगा, लेकिन मुझे याद नहीं है कि यह इस समय क्या है।
एलेक्स एटकिन्सन

आप जानते हैं कि आप एक निष्पादन के साथ उपयोग कर सकते हैं? find . -exec echo {} \;
पास्कल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.