2016-10-07 4 views
1

ich eine Datei mit folgenden Aufzeichnungen habensed mehrere Ersetzungen mit Zeilenbereich

user1,fuser1,luser1,[email protected],data,user1 
user2,fuser2,luser2,[email protected],data,user2 
user3,fuser3,luser3,[email protected],data,user3 

Ich wollte ein paar Textersetzungen von

user1, fuser1, luser1, user1 @ test.com, Daten, user1 auszuführen

zu

New_user1, New_fuser1, New_luser1, New_user1 @ test.com, Daten, New_user1

also schrieb ich unten sed Skript.

sed -i -e 's/user/New_user/g; s/fuser/New_fuser/g; s/luser/New_luser/g' file 

Dies funktioniert perfekt. Jetzt habe ich eine Anforderung, die ich in bestimmten Zeilenbereich ersetzen möchte.

start=2 
end=3 
sed -i -e ''${start},${end}'s/user/New_user/g; s/fuser/New_fuser/g; s/luser/New_luser/g' file 

Dieser Befehl ersetzt jedoch das Muster in allen Zeilen. Beispiel ausgegeben wird,

user1,New_fuser1,New_luser1,[email protected],data,New_user1 
user2,New_fuser2,New_luser2,[email protected],data,New_user2 
user3,New_fuser3,New_luser3,[email protected],data,New_user3 

Sieht aus wie Bereich nur zum ersten Ausdruck angewandt wird, immer und verbleibenden Ausdrücke auf ganze Datei angewandt zu werden. Wie kann dieser Bereich auf alle Ausdrücke angewendet werden?

+0

Ich glaube nicht, dass 'sed' Skript _w orks perfect_: 'New_user1, fNew_user1, lNew_user1'. Was ist Ihre erwartete Ausgabe mit diesen Eingabedaten? –

Antwort

1

Sie awk Variablen verwenden, können für diese Funktion zu nutzen, verwendet, um die Zeilen- und Spaltennummern Steuerung zum Ersetzen

awk -vFS="," -vOFS="," -v columnStart=2 -v columnEnd=3 -v rowStart=1 -v rowEnd=2 \ 
    'NR>=rowStart&&NR<=rowEnd{for(i=columnStart; i<=columnEnd; i++) \ 
      $i="New_"$i; print }' file 

wo das awk Variablen columnStart, columnEnd, rowStart und rowStart bestimmen, welche Spalten und Zeilen mit zu ersetzen, , als der Begrenzer angenommen.

Für Ihre Eingabedatei: -

$ cat input-file 
user1,fuser1,luser1,[email protected],data,user1 
user2,fuser2,luser2,[email protected],data,user2 
user3,fuser3,luser3,[email protected],data,user3 

Angenommen, ich Ersatz in Linien tun wollen 2 und 3 aus den Spalten 3-4, kann ich meine awk als

awk -vFS="," -vOFS="," -v columnStart=3 -v columnEnd=4 -v rowStart=2 -v rowEnd=3 \ 
    'NR>=rowStart&&NR<=rowEnd{for(i=columnStart; i<=columnEnd; i++) \ 
      $i="New_"$i; print }' file 
user2,fuser2,New_luser2,[email protected],data,user2 
user3,fuser3,New_luser3,[email protected],data,user3 

Set-up B. auf die letzte Spalte anwenden, setzen Sie die Werte columnStart und columnEnd auf den gleichen Wert, z sagen Sie in Spalte 6 und auf letzte Linie nur.

awk -vFS="," -vOFS="," -v columnStart=6 -v columnEnd=6 -v rowStart=3 -v rowEnd=3 \ 
    'NR>=rowStart&&NR<=rowEnd{for(i=columnStart; i<=columnEnd; i++) \ 
      $i="New_"$i; print }' file 
user3,fuser3,luser3,[email protected],data,New_user3 
0

Die folgenden Werke für mich:

START=2 
NUM=1 
sed -i -e "$START,+${NUM} s/user/New_user/g; $START,+${NUM} s/fuser/New_fuser/g; $START,+${NUM} s/luser/New_luser/g" file 

Wie Sie sehen können, gibt es mehrere Änderungen:

  1. Der Leitungsbereich an jedem Ausdruck vorhanden sein muss
  2. Die Der Bereich sollte (in diesem Fall) als Nummer der Startlinie und Anzahl der Linien dargestellt werden (die Anzahl der betroffenen Linien ist NUM + 1)
  3. Sie setzen zusätzliche Apostrophsymbole.
0

einen einzigen s Befehl:

start=1 
end=2 
sed -e "$start,$end s/\([fl]*\)user/New_\1user/g" file 

[fl]*user wird user Übereinstimmen mit optionalen f oder l ersten Buchstaben

Ausgang:

New_user1,New_fuser1,New_luser1,[email protected],data,New_user1 
New_user2,New_fuser2,New_luser2,[email protected],data,New_user2 
user3,fuser3,luser3,[email protected],data,user3 
Verwandte Themen