2012-11-21 14 views
6

के पहले 10 अक्षरों में एसईडी को सीमित करना मैं डेटाबेस में सम्मिलन के लिए बाध्य लॉग को साफ करने के लिए शैल स्क्रिप्ट के हिस्से के रूप में sed चला रहा हूं।लाइन

sed आदेशों में से एक है निम्नलिखित: एक awk बयान के लिए परिसीमक के रूप में:

sed -i 's/-/:/g' $DPath/named.query.log 

इस रूप में यह किसी भी संसाधन अनुरोध करता है कि यह भी (एक पानी का छींटा में शामिल हैं मैं उपयोग कर रहा हूँ बाधित समस्याग्रस्त किया जा करने के लिए पता चला है और नीचे)।

मेरा सवाल यह है कि मैं लाइन के पहले दस वर्णों तक उपरोक्त sed कमांड को कैसे सीमित करूं? मैंने ऐसा कोई विशिष्ट स्विच नहीं देखा है जो यह करता है, और मैं कहीं भी कहीं भी पर्याप्त नहीं हूं, जो RegEx के साथ काम करता है जो काम करता है। मैं पिछले संख्याओं से मेल खाने के लिए रेगेक्स का उपयोग नहीं कर सकता क्योंकि यह संभव है कि पैटर्न संसाधन अनुरोध का हिस्सा हो। बिल्ली, मैं #### - ## - ## के लिए पैटर्न मिलान का भी उपयोग नहीं कर सकता क्योंकि, फिर से, यह संसाधन का हिस्सा हो सकता है।

किसी भी विचार की बहुत सराहना की जाती है।

उत्तर

2

यह [लगभग हमेशा] awk साथ सरल करने के लिए उत्पादन होगा:

awk '{target=substr($0,1,10); gsub(/-/,":",target); print target substr($0,11)}' file 
+0

महोदय, मुझे लगता है कि यह करेगा। आपका बहुत बहुत धन्यवाद! – MikeH

+2

या यहां तक ​​कि (अवांछित) 'perl -pe' substr ($ _, 0, 10) = ~ s /:/-/g 'file' – tripleee

+0

@ ट्रिपली: आपकी (अनचाहे) टिप्पणी मेरे लिए काम नहीं करती है (लेकिन मैं पर्ल पता नहीं है)। –

0

आप निम्न कर सकते हैं:

cut -c 1-10 $DPath/named.query.log | sed -i 's/-/:/g' 

कटौती statemnt केवल पहले 10 कि फ़ाइल में प्रत्येक पंक्ति की वर्ण लेता है। उस के आउटपुट को फाइल में पाइप किया जाना चाहिए। अब तक यह सिर्फ अपने टर्मिनल

+2

मैं ओपी संशोधित करने के लिए करना चाहता था लगता है "-" सिर्फ पहले 10 एक लंबे समय तक लाइन के पात्रों में, 10 अक्षरों को लाइन काट-छांट नहीं और फिर सभी को संशोधित " - "एस। इसके अलावा, मुझे आश्चर्य है कि क्या sed के "-i" को संशोधित करने के लिए कोई फ़ाइल नहीं होगी .... –

1

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

paste -d"\0" <(cut -c1-10 $DPath/named.query.log | sed 's/\-/:/g') <(cut -c11- $DPath/named.query.log)

+0

यह आउटपुट को फ़ाइल के बजाए स्क्रीन पर थूकता है, लेकिन यह भी काम कर सकता है। पोस्ट के लिए धन्यवाद। :) – MikeH

2

मुझे लगता है कि कम से कम समाधान है, और शायद सबसे सरल, बल्कि awk [वार्ड] की तुलना में, sED से ही प्रदान की जाती है:

sed "h;s/-/:/g;G;s/\(..........\).*\n........../\1/" 

स्पष्टीकरण:

  • (ज) पकड़ अंतरिक्ष के लिए सब कुछ नकल के साथ
  • (रों) (पूरे पैटर्न अंतरिक्ष के लिए) प्रतिस्थापन कर
  • (G) पकड़ अंतरिक्ष संलग्न, \n विभाजक
  • \n के बाद दसवें तक वर्ण हटाएं, लेकिन पहले दस रखें।

कुछ परीक्षण कोड:

echo "--------------------------------" > foo 
sed -i "h;s/-/:/g;G;s/\(..........\).*\n........../\1/" foo 
cat foo 
::::::::::---------------------- 
+1

अच्छा! शायद थोड़ा सा सुधार 'sed' h; y/- /: /; जी; एस/^ \ (। \ {10 \} \)। * \ N। \ {10 \}/\ 1/'' – potong

+0

@ पॉटोंग : हाँ आप सही हैं। * लेकिन * कुछ पुराने सिस्टम इस वाक्यविन्यास का समर्थन नहीं करते हैं। * और * यह कम स्पष्ट है। –

+0

@ पॉटोंग: लेकिन आपका समाधान * से कम * सात वर्णों से (अनावश्यक^को अनदेखा कर रहा है)। 'Y' ने एक चरित्र बचाया। –