2017-10-25 4 views
0

Ich habe Datei wie folgt in Variable (wir ${var_file} sagen):Regex innerhalb sed innen für den Zyklus in bash auf Datei angewendet

ABC+123+456+789+12'\r 
DEF+987+98790+12+00'\r 
GHI+12+12?+39+123498345+21+1'\r 
ABC+485+2?'\r 
ABC+34?+8kj+3949+1+sdfkj+sdfkj'\r 
GHC+++sdf'\r 
ABC+123++235+5435'\r 

ich auch eine Variable $var1 enthält Nummer im INT-Format haben und $var2 enthält Beginn Linie.

Ich brauche einen sed-Befehl (oder awk/cut?) Oder eine Funktion, die Teil der Bash-Skript sein, die $var1 Position zwischen + Begrenzungszeichen auf $var2 Zeilenanfang (zB ABC oder ABC+123), global auf die Datei ersetzen (für alle möglichen Linien). Es gibt auch die Möglichkeit ?+, da ? Escape-Zeichen ist, so in diesem Fall + funktioniert nicht als Trennzeichen, es ist normaler Text. Linien sollten immer lang genug sein, um + zählen in $var1 für ausgewählte Linie Start in $var2 enthalten.

Ausgabebeispiel für Position 3 ($var1 = "3" zwischen 3. und 4. +) auf der Leitung mit ABC+123 ($var2 = "ABC+123") beginnend

Daher sollte ausgegeben werden:

ABC+123+456++12'\r 
DEF+987+98790+12+00'\r 
GHI+12+12?+39+123498345+21+1'\r 
ABC+485+2?'\r 
ABC+34?+8kj+3949+1+sdfkj+sdfkj'\r 
GHC+++sdf'\r 
ABC+123+++5435'\r 

Die Änderung auf Leitung 1 ist und Zeile 7.

Im Falle nur löschen 3. Position ($var1 = "3") on line beginnend mit ABC ($var2 = "ABC"):

ABC+123+456++12'\r 
DEF+987+98790+12+00'\r 
GHI+12+12?+39+123498345+21+1'\r 
ABC+485+2?'\r 
ABC+34?+8kj+3949++sdfkj+sdfkj'\r 
GHC+++sdf'\r 
ABC+123+++5435'\r 

Die Änderung auf der Linie 1, 5 und 7

Kann mir jemand helfen mit diesem? Ich habe verschiedene sed Befehle ausprobiert und kann einfach keine Lösung finden.

Danke!

Antwort

2

Ihre Frage ist nicht ganz klar, aber ich denke, was Sie tun möchten, ist:

awk -v start="$var2" -v col="$var1" ' 
    BEGIN { FS=OFS="+" } 
    { gsub(/[?][+]/,RS) } 
    index($0,start)==1 { $(col+1)="" } 
    { gsub(RS,"?+") } 1 
' file 
+1

Danke, es scheint es gut funktioniert. Ich werde es jetzt an mehr Beispielen ausprobieren. – Kaleb

0

Sie versuchen diese können mit sed

sed 's/?+/\n/g;/'"$var2"'/s/\(+[^+]*\)/+/'"$var1"';s/\n/?+/g' file 
+0

Seien Sie sich dessen bewusst, dass "var2" als Regexp und nicht als String behandelt wird und daher zu unerwünschten Ergebnissen führen kann, wenn var2 BRE-Metazeichen enthält. Es wird auch für var2 an einer beliebigen Stelle der Zeile getestet, anstatt am Anfang der Zeile repariere das, –