2010-12-07 11 views
32

मेरे पास प्रत्येक दिन स्वत: जेनरेट की गई फ़ाइल है जिसे शेल स्क्रिप्ट द्वारा बुलाया जाता है। लेकिन, समस्या का सामना करना पड़ रहा रहा है कि स्वत: जनरेट फ़ाइल का एक रूप है:SPRINTF?

FILE_MM_DD.dat 

... जहां एम एम और डीडी 2 अंकों माह और दिन के इस महीने के तार कर रहे हैं।

मैंने कुछ शोध किया और इसे अपने आप पर टक्कर लगी, लेकिन मुझे नहीं पता कि केवल शैल स्क्रिप्टिंग का उपयोग करके इन कस्टम स्ट्रिंग्स को कैसे बनाया जाए।

स्पष्ट है कि, मैं बैश में DATE फ़ंक्शन के बारे में पता कर रहा हूँ, लेकिन मैं क्या तलाश कर रहा हूँ सी

+0

इसके अलावा, मेरी कल्पना की आवश्यकता है कि मैं FILE_12_01.dat के बजाय FILE_12_1.dat जहां आवश्यक की तरह तार उत्पन्न करते हैं। –

+0

फिर "डीडी" गलत है। –

+1

सही, डीडी मेरे spec का हिस्सा नहीं है, लेकिन चीजों को समझाने के लिए सिर्फ एक शॉर्टकट है। कोई विचार? –

उत्तर

42

बैश में:

var=$(printf 'FILE=_%s_%s.dat' "$val1" "$val2") 

या, बराबर, और sprintf के करीब:

printf -v var 'FILE=_%s_%s.dat' "$val1" "$val2" 

अपने चर पहले शून्य दशमलव मान होते हैं, तो आप अग्रणी शून्य को हटा सकते हैं :

val1=008; val2=02 
var=$(printf 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2))) 

या

printf -v var 'FILE=_%d_%d.dat' $((10#$val1)) $((10#$val2)) 

$((10#$val1)) आधार 10 में मूल्य coerces तो प्रारूप विनिर्देश में %d नहीं लगता है कि "08" एक अमान्य ऑक्टल मान है।

आप date उपयोग कर रहे हैं (जीएनयू date कम से कम के लिए), तो आप इस तरह अग्रणी शून्य को छोड़ सकते हैं:

date '+FILE_%-m_%-d.dat' 

पूर्णता के लिए, यदि आप अग्रणी शून्य जोड़ने करना चाहते हैं, एक के लिए गद्देदार निश्चित चौड़ाई:

val1=8; val2=2 
printf -v var 'FILE=_%04d_%06d.dat' "$val1" "$val2" 

या गतिशील चौड़ाई के साथ:

val1=8; val2=2 
width1=4; width2=6 
printf -v var 'FILE=_%0*d_%0*d.dat' "$width1" "$val1" "$width2" "$val2" 

अग्रणी शून्य जोड़ना उन मानों को बनाने के लिए उपयोगी है जो आसानी से क्रमबद्ध होते हैं और स्तंभों में अच्छी तरह से संरेखित होते हैं।

+0

धन्यवाद डेनिस। यह अब तक का सबसे नज़दीकी समाधान है जिसे मैंने देखा है। और निकटतम से, मेरा मतलब सही है :) –

+1

उद्धरण! '" $ var1 "', '" var var "" इत्यादि। यह भी जानना कि मान संख्यात्मक हैं - यदि आईएफएस में अंक हैं तो क्या होगा? –

+1

@ चार्ल्सडफी: उद्धरण जोड़ा गया। आम तौर पर, मेरे पास एक पर्यवेक्षी कार्य होता है जो यह पता लगाता है कि 'आईएफएस' में अंकों या अन्य अवांछित स्थितियों का अस्तित्व है या नहीं, और यदि ऐसा है, तो सभी पहुंच योग्य फाइल सिस्टमों के लिए 'dd' का शून्य है। ;-) –

7

में sprintf समारोह के बराबर है क्यों coreutils से printf प्रोग्राम का उपयोग नहीं?

$ printf "FILE_%02d_%02d.dat" 1 2 
FILE_01_02.dat 
+1

धन्यवाद, हेलो। मुझे यह विकल्प भी मिला: $ दिनांक "+ FILE_% m_% d" FILE_12_07 –

+0

स्पष्ट होने के लिए, मुझे क्या पसंद है अग्रणी शून्यों का एक छंटनी है, लेकिन मुझे लगता है कि मैं इसे प्रिंटर मैन से बाहर निकाल सकता हूं पृष्ठ। –

+0

"अग्रणी शून्यों के छंटनी" से आपका क्या मतलब है? यदि आवश्यक हो तो कृपया मुझे प्रिंट करें या printf या regex जादू पर अपने कौशल की पेशकश करेंगे ;-) यदि आपको स्वयं का समाधान मिल जाए, तो कृपया पोस्ट करें। मुझे वास्तव में क्या चाहिए इसकी समझ में दिलचस्पी होगी। –

1

प्रयास करें:

sprintf() { local stdin; read -d '' -u 0 stdin; printf "[email protected]" "$stdin"; } 

उदाहरण:

$ echo bar | sprintf "foo %s" 
foo bar 
संबंधित मुद्दे