2016-07-29 7 views
0

Datei mit sed und regulären Ausdrücken innerhalb TAR-Datei Zeilen in Textdatei Ersetzen enthält Zeilen wie diese:<code>b.txt</code><code>b.tar</code> in einer TAR-Datei

dir1 => /dir1A 
dir2 => /dir2A 

ich einen prägnanten Ausdruck mit zum Ersetzen es in der TAR-Datei möchte stattdessen eine Version mit diesen Zeilen:

dir1 = /dir1B 
dir2 = /dir2B 

der Ausdruck kann sich darauf verlassen, dass eine Kopie b.txt im selben Verzeichnis wie a.tar existiert.

Meine sed Fähigkeiten sind ein bisschen rostrott. Ich habe folgendes versucht, aber es funktioniert noch nicht. Was ist mein Fehler? Gibt es eine noch prägnantere Version? Diese

tar df a.tar b.txt 
echo b.txt | 
    sed \#^dir1[ \t]*=>.*$#dir1 => /dir1B# | 
    sed \#^dir2[ \t]*=>.*$#dir2 => /dir2B# | 
    tar af a.tar - 
+1

so die 'tar' Datei wirklich nicht in Ihr Problem geben, da Sie habe es schon "geteert"? Die korrekte Syntax für eine Substitution in sed ist 'sed '\ # ... # ... #' file' (beachten Sie die führenden' s und einfachen Anführungszeichen). Sie können auch mehrere Ersetzungen in einem Aufruf kombinieren wie 'sed 's # # # # # # # # # # # # # # # # # # # (beachten Sie das Semikolon, das die Befehle trennt). Viel Glück; – shellter

Antwort

1

(ist etwas weniger prägnant als ich ursprünglich gehofft hatte, aber) offenbar funktioniert der Trick:

TMP_DIR=`mktemp -d` 
cat b.txt | \ 
    sed 's#^\(dir1A\s*=\s*\)\(.*\)\(\s*\)$#\1/dir1B\3#' | \ 
    sed 's#^\(dir2A\s*=\s*\)\(.*\)\(\s*\)$#\1/dir2B\3#' > \ 
    $TMP_DIR/b.txt 
tar fv a.tar --delete ./b.txt 
tar fv a.tar -C $TMP_DIR --append ./b.txt 
rm -fr $TMP_DIR