2012-10-22 13 views
5

में किसी फ़ाइल को सशर्त रूप से जोड़ या जोड़ना मुझे एक स्क्रिप्ट के माध्यम से फ़ाइल को संशोधित करने की आवश्यकता है।
मुझे निम्न कार्य करने की आवश्यकता है:
यदि कोई विशिष्ट स्ट्रिंग मौजूद नहीं है तो इसे संलग्न करें।लिनक्स स्क्रिप्ट

तो मैं निम्न स्क्रिप्ट बनाया:

#!/bin/bash 
if grep -q "SomeParameter A" "./theFile"; then 
echo exist 
else 
    echo doesNOTexist 
    echo "# Adding parameter" >> ./theFile  
    echo "SomeParameter A" >> ./theFile  
fi 

यह काम करता है लेकिन मैं कुछ सुधार की ज़रूरत है।
मुझे लगता है कि अगर मैंने "कुछ पैरामीटर" मौजूद है तो जांच बेहतर होगी और फिर देखें कि इसके बाद "ए" या "बी" है या नहीं। यदि यह "बी" है तो इसे "ए" बनाएं।
अन्यथा स्ट्रिंग को जोड़ना (जैसे मैं करता हूं) लेकिन टिप्पणियों के अंतिम ब्लॉक की शुरुआत से पहले।
मैं यह कैसे कर सकता हूं?
मैं पटकथा में अच्छा नहीं हूँ।
धन्यवाद!

+0

क) आप का अंतिम ब्लॉक पर विचार करते हैं टिप्पणियाँ? बी) आपका क्या मतलब है "कुछ पैरामीटर" के बाद "ए" या "बी" होता है, क्या इसका मतलब यह है कि केवल एक स्थान या रिक्त स्थान उनके बीच है? – bbaja42

+0

@ bbaja42: ए) फ़ाइल टिप्पणी सामग्री के अंत में '#' से शुरू होने वाली रेखाओं की एक श्रृंखला है। यदि यह आसान/संभव है तो मैं इससे पहले लिखना चाहूंगा। बी) मैं इसे मजबूत बनाने की कोशिश कर रहा हूं और ध्यान में रखकर 1 से अधिक स्थान मौजूद होने का मौका – Jim

उत्तर

-1

एक पर्ल एक लाइनर

perl -i.BAK -pe 'if(/^SomeParameter/){s/B$/A/;$done=1}END{if(!$done){print"SomeParameter A\n"}} theFile 

एक बैकअप theFile.BAK बनाया जाएगा (मैं विकल्प)। एक और वर्बोज़ संस्करण, जो परीक्षण के लिए अंतिम टिप्पणियों को ध्यान में रखता है।

rename "theFile.tmp", "theFile" 
+0

मुझे इसे एक spec फ़ाइल से करने की ज़रूरत है। मुझे यकीन नहीं है कि मैं perl – Jim

+0

सुनिश्चित कर सकता हूं, तो आप इसे पढ़ सकते हैं perl, आप spec फ़ाइल कैसे पढ़ते हैं? –

+0

मैं इसे नहीं पढ़ता। मैं स्क्रिप्ट को एक spec फ़ाइल – Jim

2
awk 'BEGIN{FLAG=0} 
    /parameter a/{FLAG=1} 
    END{if(flag==0){for(i=1;i<=NR;i++){print}print "adding parameter#\nparameter A#"}}' your_file 

BEGIN{FLAG=0} की शुरुआत से पहले एक झंडा चर -initializing: एक पाठ फ़ाइल में बचाया जाना चाहिए और perl my_script.pl या chmod u+x my_script.pl./my_script.pl

#!/usr/bin/perl 

use strict; 
use warnings; 

my $done = 0; 
my $lastBeforeComment; 
my @content =(); 
open my $f, "<", "theFile" or die "can't open for reading\n$!"; 
while (<$f>) { 
    my $line = $_; 
    if ($line =~ /^SomeParameter/) { 
    $line =~ s/B$/A/; 
    $done = 1; 
    } 
    if ($line !~ /^#/) { 
    $lastBeforeComment = $. 
    } 
    push @content, $line; 
} 
close $f; 
open $f, ">", "theFile.tmp" or die "can't open for writting\n$!"; 
if (!$done) { 
    print $f @content[0..$lastBeforeComment-1],"SomeParameter A\n",@content[$lastBeforeComment..$#content]; 
} else { 
    print $f @content; 
} 
close $f; 

एक बार यह ठीक है निष्पादित उसके बाद निम्न जोड़ने फाइल प्रसंस्करण

/parameter a/{FLAG=1} अगर फ़ाइल में पैरामीटर पाया जाता है तो ध्वज को सेट करना।

END{if(flag==0){for(i=1;i<=NR;i++){print}print "adding parameter#\nparameter A#"}} -finally फ़ाइल

+0

में रखूंगा यदि आप समझा सकते हैं कि आप क्या कर रहे हैं तो यह बहुत अच्छा होगा! – Jim

+0

@ जिम ... सिर्फ इतना है कि इसका निष्कासन नहीं है इसका मतलब यह नहीं है कि आपको वोट देना चाहिए। – Vijay

+0

मैंने ** ** ** डाउनवोट नहीं किया !!!! मैं इसे सुधारने के लिए अपवॉट (+1) करूंगा। – Jim

7

पहले के अंत में लाइनों को जोड़ने, अगर वे पहले से मौजूद किसी भी SomeParameter लाइनों बदल जाते हैं। यह अतिरिक्त रिक्त स्थान के किसी भी संख्या के साथ, SomeParameter या SomeParameter B तरह लाइनों के साथ काम करना चाहिए:

sed -i -e 's/^ *SomeParameter\(\+B\)\? *$/SomeParameter A/' "./theFile" 

तब पंक्ति जोड़ने अगर यह मौजूद नहीं है:

if ! grep -qe "^SomeParameter A$" "./theFile"; then 
    echo "# Adding parameter" >> ./theFile  
    echo "SomeParameter A" >> ./theFile  
fi