2016-07-07 9 views
0

Ich versuche meine Skripts zu ändern.Ändern von Text in eine Datei

create table T1 
a, 
b) 
/
INSERT... 
/
UPDATE ... 
/
create table T2 
a, 
b) 
/

Ich möchte wie die Datei ändern:

create table T1 
a, 
b) TABLESPACE TS 
/
INSERT... 
/
UPDATE ... 
/
create table T2 
a, 
b) TABLESPACE TS 
/

So möchte ich Text erhalten zwischen "create table" und "/" und fügen Sie das Wort "TABLE TS" über dem Wort „/ ". kann mir jemand helfen, welche Möglichkeiten ich hier sed Befehl verwenden kann?

+0

Added 'bash'-Tag. Wenn Sie nicht Bash verwenden, fühlen Sie sich frei, Rollback auf die vorherige Version – sjsam

Antwort

0

Eingangs

create table T1 
a, 
b) 
/
create table T2 
a, 
b) 
/
Some Stuff 
b) 
/
b) again 

Script

sed '/^create table/{:l1;n;/^\/$/!{s/^b)$/b) TABLESPACE TS/g;b l1}}' file 

Output

create table T1 
a, 
b) TABLESPACE TS 
/
create table T2 
a, 
b) TABLESPACE TS 
/
Some Stuff 
b) 
/
b) again 

Was passiert hier?

  • Wir verwendeten sed Stream-Editor hier.
  • s Option für sed es bedeutete für die Ersetzung.
  • s Format ist s/pattern/replacement/g wo g Flag dient globale Substitution.
  • :l1 wird verwendet, um ein Etikett nach dem Drucken Stromraum l1
  • n nächste Zeile zu dem Musterraum angeben hinzufügt.
  • !{group} wird verwendet, um eine Gruppe von Befehlen zu negieren. In unserem Fall wird gesagt, wenn das Muster / übereinstimmt, versuchen Sie nicht von Befehlen.
  • b ist für unbedingte Springen zu einem Etikett. So springt b l1 zum Etikett l1.
  • Lesen Sie nun die Antwort im Lichte dieser Punkte.

Hinweis

SEd selbst erweitert Editor zu streamen. Für weitere Informationen überprüfen Sie [ this ].

+0

Es gibt auch anderen Text mit dem Wort "/", so dass Ersatz funktioniert nicht.habe den Brocken zwischen "Tabelle erstellen" und "/" und dann muss geändert werden.Anderer Text muss gleich bleiben. –

+0

@AjaySingh: Ich verstehe. diese Anforderung wurde ursprünglich nicht erwähnt. Ich werde es gleich aktualisieren. – sjsam

+0

@AjaySingh: Ich habe aktualisiert, um die Anforderung jetzt zu erfüllen. – sjsam

0

Verwenden Sie / als Datensatztrennzeichen.

awk -v RS=/ -v ORS=/ -v IGNORECASE=1 ' 
    /create table/ { print $0, "TABLESPACE TS\n";next } 
    $0 != "\n" 
    END {printf("\n")}' inputfile > outputfile 
0

mit GAWK

awk 'BEGIN{RS="\n/"} {printf "%s",$0} /create/{printf "%s"," TABLESPACE TS"} {printf "%s",RS}' file 

Ausgabe

create table T1 
a, 
b) TABLESPACE TS 
/
INSERT... 
/
UPDATE ... 
/
create table T2 
a, 
b) TABLESPACE TS 
/

BEGIN{RS="\n/"} #set RS 
    {printf "%s",$0} # print record 
    /create/{printf "%s"," TABLESPACE TS"} #append if create is present in record 
    {printf "%s",RS} # append seperator 
+1

Sie sollten erwähnen, dass es gawk-spezifisch ist, da es RS mit mehreren Zeichen enthält. Verwenden Sie immer 'printf'% s ', $ 0' anstelle von 'printf $ 0' - stellen Sie sich den Unterschied vor, wenn '$ 0' Druckformatierungszeichen wie '% s' enthält. –

+0

Das funktionierte wie Charme. Danke vielmals. –

+0

FYI http://stackoverflow.com/help/accepted-answer – Chet