2012-03-23 18 views
12

मैंने अपनी निर्देशिका में कई फाइलें देखीं, जिन्हें "sedAbCdEf" या ऐसा कहा जाता है।sed कई फ़ाइलों को क्यों छोड़ देता है?

  • यह इन फ़ाइलों को क्यों बनाता है?
  • क्या स्क्रिप्ट चलाने के बाद इनका कोई मूल्य है?
  • क्या मैं इन फ़ाइलों को किसी अन्य स्थान पर भेज सकता हूं, उदा। /tmp/?

अद्यतन:

मैं स्क्रिप्ट की जाँच की जब तक मैं एक जो फ़ाइलें बनाता पाया। यहां कुछ नमूना कोड है:

#!/bin/bash 
a=1 
b=`wc -l < ./file1.txt` 
while [ $a -le $b ]; do 
    for i in `sed -n "$a"p ./file1.txt`; do 
     for j in `sed -n "$a"p ./file2.txt`; do 
      sed -i "s/$i/\nZZ$jZZ\n/g" ./file3.txt 
      c=`grep -c $j file3.txt` 
      if [ "$c" -ge 1 ] 
      then 
       echo $j >> file4.txt 
       echo "Replaced "$i" with "$j" "$c" times ("$a"/"$b")." 
      fi 
       echo $i" not found ("$a"/"$b")." 
      a=`expr $a + 1` 
     done 
    done 
done 
+1

आपको लगता है कि यह sed से संबंधित क्यों है? पाठ्यक्रम के फ़ाइल नाम को छोड़कर, – cctan

+0

मुझे लगता है कि इसे किसी और चीज द्वारा बनाया जा सकता है, हालांकि, मैं उन्हें बाश स्क्रिप्ट चलाने के बाद ढूंढता हूं और बाश स्क्रिप्ट में 'sed' होता है। सभी फाइलनाम "sed" के साथ शुरू होते हैं, इसके बाद कुछ यादृच्छिक अक्षर होते हैं। – Village

+1

क्या आप बैश स्क्रिप्ट पोस्ट कर सकते हैं? मैं एक ऐसे भाग की तलाश में हूं जो 'blabla> sedAbCdEf' कहता है? – cctan

उत्तर

11
  • यह इन फ़ाइलों को क्यों बनाता है?

sed -i "s/$i/\nZZ$jZZ\n/g" ./file3.txt

-i विकल्प के लिए एक अस्थायी फ़ाइल में sed भंडार stdout उत्पादन करता है।
sed के बाद किया गया है, यह आपके मूल file3.txt को प्रतिस्थापित करने के लिए इस अस्थायी फ़ाइल का नाम बदल देगा।
अगर sed चल रहा है तो कुछ गलत है, तो इन sedAbCdE temp फ़ाइलों को वहां छोड़ा जाएगा।

  • क्या स्क्रिप्ट चलाने के बाद इनका कोई मूल्य है?

आपकी पुरानी फ़ाइल छूटी नहीं है। आमतौर पर नहीं।

  • क्या मैं इन फ़ाइलों को किसी अन्य स्थान पर भेज सकता हूं, उदा।/Tmp /?

हाँ आप ऊपर देख सकते हैं।

संपादित करें: आगे पढ़ने के लिए this देखें।

+0

[जीएनयू sed-4.2 के लिए स्रोत कोड] (http://stackoverflow.com/a/9834294/4279) जैसा कि मैं समझता हूं कि यह कहता है कि इन फ़ाइलों को किसी अन्य स्थान पर भेजना असंभव है – jfs

+0

@JFSebastian मुझे लगता है कि गांव का मतलब है सभी लिपि चलने बंद होने के बाद, ओपी की पुष्टि कर सकते हैं? – cctan

1

यह हो सकता है कि, जब से तुम बहुत ज्यादा एसईडी कार्यों, और एक looped पैटर्न में, SED tmp फ़ाइलें जो ठीक से नहीं हटाया जाता प्रदान कर सकते हैं इस्तेमाल किया है।

Sed creates un-deleteable files in Windows

इस पोस्ट पर एक नजर डालें, SED इस तरह के एक मुद्दा पहले सूचित होना शेष है। बेहतर तरीका यह है कि एक स्क्रिप्ट बनाने के लिए जो फ़ाइलों को हटा देता है, या एक ऐसी फ़ंक्शन बनाता है जो सभी फ़ाइलों को हटा देता है जो सभी फ़ाइलों को sed के साथ शुरू करने वाले नाम से हटाते हैं, (^ sed *) चीज़ की तरह।

5

यदि आप -i विकल्प का उपयोग करते हैं (इसका मतलब है कि जगह बदलना है) sed एक अस्थायी फ़ाइल में लिखता है और फिर इसे आपकी फ़ाइल में नाम देता है। इस प्रकार यदि ऑपरेशन निरस्त हो गया है तो आपकी फ़ाइल अपरिवर्तित बनी हुई है।

आप देख सकते हैं जो फ़ाइलें, खोल रहे हैं strace साथ नाम दिया:

$ strace -e open,rename sed -i 's/a/b/g' somefile 

नोट: somefile के रूप में केवल पढ़ने के लिए खोला जाता है।

ऐसा लगता है कि बैकअप निर्देशिका को ओवरराइड करने का कोई तरीका नहीं है। जीएनयू sed हमेशा फ़ाइल की निर्देशिका (± symlinks) में लिखता है। sed/execute.c से:

if (follow_symlinks) 
    input->in_file_name = follow_symlink (name); 
else 
    input->in_file_name = name; 

/* get the base name */ 
tmpdir = ck_strdup(input->in_file_name); 
if ((p = strrchr(tmpdir, '/'))) 
    *(p + 1) = 0; 
else 
    strcpy(tmpdir, "."); 

उपसर्ग sed hardcoded है:

output_file.fp = ck_mkstemp (&input->out_file_name, tmpdir, "sed"); 
+0

अस्थायी फ़ाइल को उसी निर्देशिका में बनाया जाना चाहिए जैसे फ़ाइल ' अंत में नाम बदल दिया जाएगा, अन्यथा आप यह सुनिश्चित नहीं कर सकते कि नाम काम करेगा। 'sed' को अपनी अस्थायी फ़ाइलों को हटाना चाहिए यदि यह पुराने फ़ाइलों को बदलने के लिए उनका उपयोग नहीं करता है, हालांकि। – zwol

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