Mit RegEx Spalte 38 (er)setzen

C

cognitiv

Grünschnabel
Hallo @ll,

ich muss in Zeilen, die an Spalte 20 eine 2 haben, in Spalte 38 ein "X" einbringen.
Die Zeilen zu finden, die das erste Kriterium erfüllen, ist ja kein Problem, aber an der zweiten Aktion breche ich mir 'nen Ast:
sed "s/[[:print:]]\{37\}[.] */[[:print:]]\{37\}[.]X*/g"
bringt mir die Zeilen unverändert wieder zurück.
Was mache ich falsch?
Geht das u.U. auch in einem Rutsch?

:hilfe2: me plz!
 
Hi,

es waere nett wenn du Code Bloecke benutzen koenntest, dann tauchen im Code auch keine Smileys mehr auf. ;)

Ich denke dass sed in diesem Fall das falsche tool ist. Mit sed geht's vielleicht auch, aber dann muss man sich unnoetig verrenken. ;)

Hier mal ein kurzes Beispiel, wie du das z.B. mit awk loesen koenntest, wenn du die Ausgabe erst in einer zweiten Datei speicherst:
Code:
echo "1234567890" | awk -F "" '
{
   if ($5 == 5) 
   {
      OFS="";
      $9=$9"X";
      print $0;
   }
   else print $0;
}' # > file.tmp
Die Option -F "" setzt den field seperator auf den leeren String, d.h. jede Spalte ist ein Feld. Dann wird getestet ob in Spalte 5 eine 5 steht, und wenn ja wird in Spalte 9 ein X angehangen und dann die ganze Zeile ausgegeben. Wenn der Test fehlschlaegt, wird direkt die ganze Zeile ausgegeben, ohne irgendetwas zu veraendern.

Edit:
Aber wenn es denn unbedingt sed sein muss:
Code:
echo "1234567890" | sed 's$\(.\{8\}\).$\1X$'
Ersetzt Position 9 mit einem X.

mfg,
bytepool
 
Zuletzt bearbeitet:
Vielen Dank für die schnelle Antwort,
ich hatte zunächst ein Problem, weil mein Ausgangsstring nicht zwingend schon die Position 38 überhaupt enthält, musste als den String künstlich verlängern, dann klappte es auch mit dem sed:

echo "ABCDEFGHIJKLMNOPQ/2A" | awk '{printf("%-40s\n",$1)}' | sed 's$\(.\{37\}\).$\1X$'

Den ersten Vorschlag konnte ich bisher nicht erfolgreich testen, weil der awk mir Syntaxfehler vorwirft. Ich werde die Parameter mal in ein externes File schreiben und beim Aufruf von dort lesen.
 
Zurück
Oben