2012-10-15 16 views
5

में प्लेसहोल्डर्स/वेरिएबल्स का उपयोग करके मैं मिलान किए गए परिणाम का एक विशिष्ट भाग बाद में प्रतिस्थापन के लिए उपयोग किए जाने वाले चर के रूप में संग्रहीत करना चाहता हूं। मैं हाथ से पहले आवश्यक चर खोजने के बजाय इसे एक लाइनर में रखना चाहता हूं।एक sed कमांड

जब अपाचे को विन्यस्त, और उपयोग mod_rewrite, आप पैटर्न के विशिष्ट भागों specificy कर सकते हैं, चर के रूप में प्रयोग की जाने वाली इस तरह:

RewriteRule ^www.example.com/page/(.*)$ http://www.example.com/page.php?page=$1 [R=301,L] 

पैटर्न मैच का हिस्सा है कि कोष्ठक के अंदर निहित है $ 1 के रूप में संग्रहीत किया जाता है बाद में उपयोग के लिए। तो अगर यूआरएल www.example.com/page/home था, तो इसे www.example.com/page.php?page=home के साथ बदल दिया जाएगा। तो मैच का "घर" भाग $ 1 में सहेजा गया था क्योंकि यह ब्रांड्स के अंदर पैटर्न का हिस्सा था।

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

... 
CREATE TABLE `orders` 
... 

मैं की तरह कुछ चलाने की आवश्यकता:

: के परिणाम प्राप्त करने के

cat dump.sql | sed "s/CREATE TABLE `(.*)`/DROP TABLE IF EXISTS $1\N CREATE TABLE `$1`/g" 

इस है, तो डंप फ़ाइल की तरह कुछ है या नहीं

... 
DROP TABLE IF EXISTS `orders` 
CREATE TABLE `orders` 
... 

मैं sed कमांड में mod_rewrite वाक्यविन्यास का उपयोग कर रहा हूं जो कि मैं जो करने का प्रयास कर रहा हूं उसके तार्किक उदाहरण के रूप में।

कोई सुझाव?

उत्तर

8
sed '/CREATE TABLE \([^ ]*\)/ s//DROP TABLE IF EXISTS \1; &/' 

एक तालिका तालिका विवरण बनाएं और तालिका का नाम कैप्चर करें। इसे 'ड्रोप टेबल IF EXISTS' और तालिका का नाम, साथ ही कथन को समाप्त करने के लिए अर्द्ध-कोलन, और CREATE तालिका कथन को संरक्षित करने के लिए मिलान की गई एक प्रति के साथ बदलें।

यह क्लासिक sed नोटेशन है। चूंकि आप bash का उपयोग कर रहे हैं, तो एक मौका है कि आप जीएनयू sed का उपयोग कर रहे हैं और उस नोटेशन का उपयोग करने के लिए --posix जोड़ने की आवश्यकता होगी, या आपको स्क्रिप्ट को जीएनयू के गैर मानक sed रेगेक्स का उपयोग करने की आवश्यकता होगी। मैंने आउटपुट में एक नई लाइन डालने का भी प्रयास नहीं किया है। आप जीएनयू sed के साथ ऐसा कर सकते हैं यदि यह आपके लिए महत्वपूर्ण है।

मुख्य बिंदु हैं कोष्ठक (क्लासिकल रूप से बैकस्लैश से बचने की आवश्यकता) कैप्चर तंत्र हैं, और बैकस्लैश-नंबर प्रतिस्थापन तंत्र है।

+0

इस स्पष्टीकरण के लिए धन्यवाद, यह पूरी तरह से मेरे प्रश्न का उत्तर है। –

6
sed -r "s/CREATE TABLE (\`.*\`)/DROP TABLE IF EXISTS \1\n &/g" dump.sql 

परीक्षण:

kent$ cat t.txt 

CREATE TABLE `orders` 
... 

CREATE TABLE `foo` 
... 
... 

CREATE TABLE `bar` 
... 


kent$ sed -r "s/CREATE TABLE (\`.*\`)/DROP TABLE IF EXISTS \1\n &/g" t.txt 

DROP TABLE IF EXISTS `orders` 
CREATE TABLE `orders` 
... 

DROP TABLE IF EXISTS `foo` 
CREATE TABLE `foo` 
... 
... 

DROP TABLE IF EXISTS `bar` 
CREATE TABLE `bar` 
... 
+0

धन्यवाद, यह एक उत्कृष्ट स्पष्ट उदाहरण है। –

1

यह एक "वापस संदर्भ" कहा जाता है। और sed कोष्ठक के बीच की चीजों की संख्या शुरू करना शुरू कर देगा। \ (... \)

बैकस्लैश का उपयोग ऊपर से बचने वाले चरित्र के रूप में नोट करें।

रेफरी: https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html