2016-12-22 3 views
1

ich habe folgendes Problem: Ich versuche, aus einer bestimmten Zeile zu Kommentar-, das bestimme ich mit:sed uncomment mehrere Zeilen Variablen in der Bash mit

LINESTART=$(grep -nr "matching string" test.conf | cut -d : -f1) 

Danach brauche ich den Teil des Codes Kommentar- von der $LINESTART zu $((LINE+10))

LINEEND=$((LINE+10)) 

ich versuchte, die folgende Sed Syntax:

sed -i '${LINESTART},${LINEEND} s/# *//' test.conf 

Aber ich erhalte den folgenden Fehler:

sed: -e expression #1, char 4: extra characters after command 

Beispiel test.conf:

84  #server { 
85  # listen  8000; 
86  # listen  somename:8080; 
87  # server_name somename alias another.alias; 
88 
89  # location/{ 
90  #  root html; 
91  #  index index.php index.html index.htm; 
92  # } 
93  #} 
+0

Beachten Sie, dass Variablen wie '$ {} Line bash' sind nicht mit ihren Werten ersetzt, wenn in einfache Anführungszeichen. – jas

Antwort

1

könnten Sie dies versuchen;

sed -i "${LINESTART},${LINEEND} s/# *//" test.conf 

Test;

Skript:

#!/bin/bash 
LINESTART=$(grep -nr "server {" test | cut -d : -f1) 
LINEEND=$((LINE+10)) 

sed "${LINESTART},${LINEEND} s/# *//" test 

Ausgang:

$ ./test.sh 
    server { 
    listen  8000; 
    listen  somename:8080; 
    server_name somename alias another.alias; 

     location/{ 
     root html; 
     index index.php index.html index.htm; 
     } 
     } 
1

Verwendung von Shell-Variablen in einfache Anführungszeichen hält von ihnen mit ihren Werten ersetzt. Mit doppelten Anführungszeichen sollte stattdessen erreichen, was Sie wollen:

$ cat file 
# a0 
# a1 
# a2 
# a3 

$ S=2 
$ E=3 

$ sed "${S},${E}s/# *//" file 
# a0 
a1 
a2 
# a3 
0

Wenn Sie ein Backup der aktuellen test.conf trotz der direkten Bearbeitung mit sed -I Option in der Datei nehmen möchten sich dann folgende may Ihnen dabei helfen.

LINESTART=$(grep -nr "matching string" test.conf | cut -d : -f1) 
LINEEND=$((LINE+10)) 

awk -vlinestart="$LINESTART" -vlineend="$LINEEND" '{gsub(linestart,lineend,$0);print}' test.conf > test.conf_tmp 
if [[ $? == 0 ]] 
then 
    mv test.conf test.conf_bkp 
    mv test.conf_tmp test.conf 
else 
    echo "Please check there seems to be an issue as awk command didn't complete successfully." 
fi 

Auch wenn Sie einige Beispiel test.conf zeigen könnte, würde ich versucht haben, dies selbst innerhalb einzelner Befehl zu tun, lassen Sie mich wissen, wie es geht dann.

0

Sie das nicht tun, nur awk für die ganze Sache verwenden:

$ awk '/location/{c=4} c&&c--{sub(/# */,"")} 1' file 
84  #server { 
85  # listen  8000; 
86  # listen  somename:8080; 
87  # server_name somename alias another.alias; 
88 
89  location/{ 
90  root html; 
91  index index.php index.html index.htm; 
92  } 
93  #} 

Der Befehl Dateien finden btw gestattet find, nicht grep -r, und genau wie GNU sed hat -i für Inplace Editing, GNU awk hat -i inplace wenn Sie es brauchen, kann dies so sein, was Sie wirklich wollen:

$ find . -name 'file' -exec \ 
    awk -i inplace '/location/{c=4} c&&c--{sub(/# */,"")} 1' {} \;