2011-08-05 13 views
7

फ़ाइल मैं संशोधित करने की आवश्यकता शामिल हैं निम्नलिखित:अंकगणित के साथ संभव सेड प्रतिस्थापन संभव है?

block: 16, size: 16, start: 8, length: 4 

मैं फ़ाइल करना चाहते हैं ताकि ब्लॉक, आकारशुरू के लिए, जबकि मान 2 से विभाजित किया जाएगा, लंबाई के लिए मूल्यों 2.

चूंकि मुझे फ़ाइलों के पूरे समूह के लिए ऐसे संशोधन करना है, इसलिए मैं प्रतिस्थापन कार्य करने के लिए सेड का उपयोग करने पर विचार कर रहा हूं। लेकिन मुझे यकीन नहीं है कि मिलान और प्रतिस्थापन प्रक्रिया में गणना की अनुमति है।

उत्तर

8

मैं का उपयोग कर के साथ टैग की गई हर समस्या को हल करने का प्रयास करता हूं। लेकिन यहां awk के साथ आप जो करने का प्रयास कर रहे हैं उसे पूरा करना इतना आसान होगा। मेरी समाधान awk उपयोग कर रहा है (और इस मामले में sed के उपयोग के लिए भी मुश्किल है।) तो, यहाँ:

$ echo "block: 16, size: 16, start: 8, length: 4" | awk '{ 
    printf "%s %d, %s %d, %s %d, %s %d\n", $1, $2/2, $3, $4/2, $5, $6*2, $7, $8*2 
}' 
block: 8, size: 8, start: 16, length: 8 
+1

प्रविष्टियों का क्रम अलग होने पर यह अपेक्षित काम नहीं करता है, ई। जी। '" ब्लॉक: 16, प्रारंभ: 8, आकार: 8, लंबाई: 4 "' –

0

ऐसा नहीं लगता कि यह संभव है। उदाहरण देखें http://www.delorie.com/gnu/docs/sed/sed_15.html

हालांकि यदि आपके पास केवल ब्लॉक, आकार, प्रारंभ और लंबाई के लिए संभावित मानों का एक छोटा सा सेट है, तो यह आवश्यक प्रतिस्थापन को हार्ड-कोड करने के लिए सबसे तेज़ हो सकता है। अगला सबसे आसान विकल्प शायद awk का उपयोग करना है, लेकिन यह फ़ाइलों को जगह में संशोधित नहीं कर सकता है।

5

पर्ल यहाँ उपयोगी है:

perl -pe ' 
    s{(\D+)(\d+)(\D+)(\d+)(\D+)(\d+)(\D+)(\d+)} 
    {$1 . $2/2 . $3 . $4/2 . $5 . $6*2 . $7 . $8*2}e 
' file 

आप में आपकी फ़ाइलों को संपादित करना चाहते हैं जगह, perl में -i विकल्प है जैसे sed।

+1

आपका मतलब है कि * sed * में '-i' विकल्प * perl * है, न कि दूसरी तरफ। आपको * sed *, बीटीडब्ल्यू के लिए POSIX spec में विकल्पों की आवश्यक सूची में '-i' विकल्प नहीं मिलेगा, बल्कि कुछ विक्रेता बंदरगाहों में केवल कभी-कभी और अनौपचारिक रूप से। पढ़ें: 'sed -i' ** सार्वभौमिक रूप से समर्थित नहीं है **, हालांकि 'perl -i' है। – tchrist

5

(यह करने के लिए सही उपकरण awk है, लेकिन एक एसईडी व्यायाम का मजाक ... के लिए)

यह संभव है sed में। सब के बाद, 2 से गुणा कुछ सरल नियमों के अनुसार पिछले अंक के प्रतिस्थापन की सेट है:

  • 0 -> 0
  • 1 -> 2
  • 2 -> 4
  • 3 -> 6
  • ...
  • 8 -> 16
  • 9 -> 18

कैरी अंकों की देखभाल करने के लिए, प्रत्येक नियम दो बार लिखा जाना चाहिए।

यह sed स्क्रिप्ट, कि sed -f script साथ चलाया जा सकता है, इनपुट तर्ज पर सभी नंबरों की 2 से गुणा करते हैं: 2 से

s/$/\n\n/ 
:loop 
s/0\n1\n/\n\n1/;t loop 
s/0\n\n/\n\n0/;t loop 
s/1\n1\n/\n\n3/;t loop 
s/1\n\n/\n\n2/;t loop 
s/2\n1\n/\n\n5/;t loop 
s/2\n\n/\n\n4/;t loop 
s/3\n1\n/\n\n7/;t loop 
s/3\n\n/\n\n6/;t loop 
s/4\n1\n/\n\n9/;t loop 
s/4\n\n/\n\n8/;t loop 
s/5\n1\n/\n1\n1/;t loop 
s/5\n\n/\n1\n0/;t loop 
s/6\n1\n/\n1\n3/;t loop 
s/6\n\n/\n1\n2/;t loop 
s/7\n1\n/\n1\n5/;t loop 
s/7\n\n/\n1\n4/;t loop 
s/8\n1\n/\n1\n7/;t loop 
s/8\n\n/\n1\n6/;t loop 
s/9\n1\n/\n1\n9/;t loop 
s/9\n\n/\n1\n8/;t loop 
s/\n1\n/\n\n1/;t loop 
s/\(.\)\n\n/\n\n\1/;t loop 
s/^\n\n// 

सम संख्या डिवाइडिंग, एक ही तर्क है, लेकिन से सही का सही बजाय बाईं छोड़ दिया करने के लिए:

h 
s/, start.*// 
s/^/\n\n/ 
t loopa 
:loopa 
s/\n1\n0/5\n\n/;t loopa 
s/\n\n0/0\n\n/;t loopa 
s/\n1\n1/5\n1\n/;t loopa 
s/\n\n1/\n1\n/;t loopa 
s/\n1\n2/6\n\n/;t loopa 
s/\n\n2/1\n\n/;t loopa 
s/\n1\n3/6\n1\n/;t loopa 
s/\n\n3/2\n1\n/;t loopa 
s/\n1\n4/7\n\n/;t loopa 
s/\n\n4/2\n\n/;t loopa 
s/\n1\n5/7\n1\n/;t loopa 
s/\n\n5/2\n1\n/;t loopa 
s/\n1\n6/8\n\n/;t loopa 
s/\n\n6/3\n\n/;t loopa 
s/\n1\n7/8\n\n/;t loopa 
s/\n\n7/3\n1\n/;t loopa 
s/\n1\n8/9\n\n/;t loopa 
s/\n\n8/4\n\n/;t loopa 
s/\n1\n9/9\n1\n/;t loopa 
s/\n\n9/4\n1\n/;t loopa 
s/\n1\n/5\n\n/;t loopa 
s/\n\n\(.\)/\1\n\n/;t loopa 
s/\n\n$// 
H 
g 
s/.*, start/, start/ 
s/\n.*// 
s/$/\n\n/ 
t loopb 
:loopb 
s/0\n1\n/\n\n1/;t loopb 
s/0\n\n/\n\n0/;t loopb 
s/1\n1\n/\n\n3/;t loopb 
s/1\n\n/\n\n2/;t loopb 
s/2\n1\n/\n\n5/;t loopb 
s/2\n\n/\n\n4/;t loopb 
s/3\n1\n/\n\n7/;t loopb 
s/3\n\n/\n\n6/;t loopb 
s/4\n1\n/\n\n9/;t loopb 
s/4\n\n/\n\n8/;t loopb 
s/5\n1\n/\n1\n1/;t loopb 
s/5\n\n/\n1\n0/;t loopb 
s/6\n1\n/\n1\n3/;t loopb 
s/6\n\n/\n1\n2/;t loopb 
s/7\n1\n/\n1\n5/;t loopb 
s/7\n\n/\n1\n4/;t loopb 
s/8\n1\n/\n1\n7/;t loopb 
s/8\n\n/\n1\n6/;t loopb 
s/9\n1\n/\n1\n9/;t loopb 
s/9\n\n/\n1\n8/;t loopb 
s/\n1\n/\n\n1/;t loopb 
s/\(.\)\n\n/\n\n\1/;t loopb 
s/^\n\n// 
H 
g 
s/[^\n]*\n// 
s/\n// 
:

s/^/\n\n/ 
:loop 
s/\n1\n0/5\n\n/;t loop 
s/\n\n0/0\n\n/;t loop 
s/\n1\n1/5\n1\n/;t loop 
s/\n\n1/\n1\n/;t loop 
s/\n1\n2/6\n\n/;t loop 
s/\n\n2/1\n\n/;t loop 
s/\n1\n3/6\n1\n/;t loop 
s/\n\n3/2\n1\n/;t loop 
s/\n1\n4/7\n\n/;t loop 
s/\n\n4/2\n\n/;t loop 
s/\n1\n5/7\n1\n/;t loop 
s/\n\n5/2\n1\n/;t loop 
s/\n1\n6/8\n\n/;t loop 
s/\n\n6/3\n\n/;t loop 
s/\n1\n7/8\n\n/;t loop 
s/\n\n7/3\n1\n/;t loop 
s/\n1\n8/9\n\n/;t loop 
s/\n\n8/4\n\n/;t loop 
s/\n1\n9/9\n1\n/;t loop 
s/\n\n9/4\n1\n/;t loop 
s/\n1\n/5\n\n/;t loop 
s/\n\n\(.\)/\1\n\n/;t loop 
s/\n\n$// 

उन के संयोजन, इस स्क्रिप्ट काम करते हैं

(अजीब विचार में बहुत आसान।)

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

+0

मैंने इसे समझने की कोशिश नहीं की है लेकिन आपकी टिप्पणी के आधार पर ऐसा लगता है कि यह किसी भी अंक के लिए असफल हो जाएगा लेकिन एक अंक संख्या। आप अलगाव में केवल अंतिम संख्या को प्रतिस्थापित नहीं कर सकते हैं। –

+0

मुझे पता है कि मैं अलगाव में केवल अंतिम संख्या को प्रतिस्थापित नहीं कर सकता। यही कारण है कि मेरे पास 2 '\ n' है। गुणा के लिए, इसका अधिकार समाधान है, और बीच में ले जाने वाला अंक है। – jfg956

संबंधित मुद्दे