2016-09-29 5 views
1

Ich bin neu hier und ich habe ein Problem, das ich nicht herausfinden kann. Ich versuche, eine Zeile in der * .txt-Datei durch fast dieselbe Zeile zu ersetzen, aber geändert. Ich bekomme immer noch Fehler oder Ausgabedatei ist ohne die Änderung. Kannst du mir bitte helfen?Sed ersetzt Linie mit Linie von Variable

Script:

var1=`grep "keyS.log\" type=" /C/tst/tst.txt` 
x="<\!--" 
if echo "$var1" | grep -q "$x"; then 
    echo "Already disabled"; 
else 
prefix='<!-- ' 
sufix='-->' 
modified=`echo "${var1/[[:space:]]/}" | sed 's:^.\(.*\).$:\1:'` 
final="${prefix}${modified}${sufix}" 
echo "${final}" 
`sed -i 's/${var1}/${final}/g' /C/tst/tst.txt` 
fi 

Line I in der Datei zu ändern versuchen ist wie folgt:

<category="keyS" priority="1" appender="/tmp/keyS.log"/> 

und so sein sollte:

<!-- category="keyS" priority="1" appender="/tmp/keyS.log"/--> 

Es gibt mehr Linien beginnend mit der Kategorie und es kann verschiedene Wege hinter dem Appender geben = so ist es dynamisch.

Fehler ist wie: sed: 1: "/C/tst/tst.txt": undefined label 'st/tst.txt'

Als ich

cat /C/tst/tst.txt | sed 's/${var1}/${final}/g' >> /C/tst/tsttmp.txt 

Linie zu verwenden versucht, wird in tsttmp.txt nicht geändert und ich habe auch den Zeilenabstand verloren, so dass der ganze Text eine Zeile ist.

Vielen Dank im Voraus für jede Hilfe

Stanislav

Antwort

1

Wenn ich recht verstehe Ihre Frage, unten ist, was Sie benötigen:

sed 's/^<\(category=.*keyS.log.*\)>$/<!-- \1-->/' /C/tst/tst.txt 

Das sed Muster

  • Aussehen für die Zeile beginnend mit < gefolgt von category. Dies wird ignoriert, wenn es bereits auskommentiert ist, da in diesem Fall < nicht von category gefolgt wird.
  • Muster innerhalb () gelegt wird als \1 gespeichert (und so weiter). Hier suchen wir nach keyS.log.
  • Falls zwei Übereinstimmungen auftreten, fügt das Ersatzteil Kommentare im HTML-Stil hinzu.

HINWEIS: Ich habe -i Möglichkeit, sed für Inline-Ersatz nicht verwendet. Sie können es verwenden, sobald Sie sicher sind, dass dies für Sie funktioniert.

2

Shell ist zum Aufrufen von Tools und Manipulieren von Dateien/Prozessen, nicht zum Bearbeiten von Text. Das Standard-UNIX-Textmanipulationswerkzeug für allgemeine Zwecke ist awk. Übersetzung Ihres Shell-Skript in awk es ist:

awk ' 
/keyS.log" type=/ { 
    if (/<!--/) { 
     print "Already disabled" |"cat>&2" 
    } 
    else { 
     sub(/</,"<!-- ") 
     sub(/>/,"-->") 
    } 
} 
1' /C/tst/tst.txt 

Verwenden awk -i inplace 'script' file mit GNU awk oder awk 'script' file > tmp && mv tmp file mit anderen awks die ursprüngliche Datei überschrieben werden soll.

Beachten Sie, dass die Regexp von Ihrem Skript, keyS.log" type=, nicht in der Beispieleingabe existiert, die Sie gepostet haben, <category="keyS" priority="1" appender="/tmp/keyS.log"/>, also müssen Sie das zu etwas ändern, das tut, wenn Ihre eingegebene Beispieleingabe genau ist.

Verwandte Themen