2016-06-02 6 views
0

Ich habe eine Textdatei, die einige angegebene Zeichenfolgen enthält, zuerst suchen Sie sie, löschen Sie einige Zeilen zwischen ihnen, dann fügen Sie etwas Neues hinzu. .e.wie eine Datei in Bash-Skript elegant bearbeiten

$cat foo.txt 
aaaaaa 
bbbbbb 
####start 
123456 
987655 
121212 
####end 
cccccc 
dddddd 


$ cat bar.txt 
AA 
BB 
CC 

jetzt möchte ich ein Bash-Skript, um foo.txt zu bearbeiten. Löschen von Inhalten zwischen „#### starten“ und „#### Ende“, fügen Sie Inhalt von bar.txt

neue foo.txt

$cat foo.txt 
aaaaaa 
bbbbbb 
####start 
AA 
BB 
CC 
####end 
cccccc 
dddddd 

Antwort

2

Wir können den folgenden Befehl ausführen,

sed -i '/####start/,/####end/{//!d};/####start/r bar.txt' foo.txt 

Der erste Teil "/ #### Start /,/#### Ende/{//! d}" entfernen die Linien in sein Zwischen dem Muster und dem zweiten Teil "/ #### start/r bar.txt" soll der Inhalt von bar.txt zu foo.txt hinzugefügt werden.

**Test:** 

✓ krishna-VB# cat foo.txt 
aaaaa 
bbbbbb 
####start 
123465 
454687 
146546 
####end 
cccccc 
dddddd 

✓ krishna-VB# cat bar.txt 
AA 
BB 
CC 

✓ krishna-VB# sed -i '/####start/,/####end/{//!d};/####start/r bar.txt' foo.txt 

✓ krishna-VB# cat foo.txt 
aaaaa 
bbbbbb 
####start 
AA 
BB 
CC 
####end 
cccccc 
dddddd 

Wenn Sie die gerade Ausgabe vor der Änderung der Datei überprüfen möchten, können Sie die Option '-i' vor sed entfernen.

+0

interessant, es ist sehr einfach. Ich möchte die Verwendung von // lernen! in {//! d}, wo kann ich das Dokument finden? – redmark

1

Diese awk Einzeiler sollte helfen:

awk 'NR==FNR{a[NR]=$0;n=NR;next} 
    !p;/##start/{p=1;for(i=1;i<=n;i++)print a[i];}/#end/{p=0;print}' bar foo