2016-12-05 16 views
0

Probeneingang funktioniert ist:SED Endet mit nicht mit Stringindex

3 TT 00670101J12SEP1629OCT16  6 OTP08100810+0300 DXB14351435+04001 73WCDIOYBMUKRHGLQNTVSEX  XX               M        00468673 
"7518,32S,CDIYBMULKRQHTVNSE," | sed "s/$,\{9\}\(.\{3\}\).*/\1,&/" 

Beispielausgabe erforderlich ist

7518,32S,CDIYBMULKRQHTVNSE,C 

wenn Zeichen von 170 ist ab nicht existiert ..

7518 ist Zeilennummer .. Es ist bereits entwickelt, aber ich arbeite an einer zusätzlichen Anforderung, dass, wenn Zeichen ab 170 existiert am Ende der Zeile nach dem Komma addieren Sie sonst das erste Zeichen aus dem vorherigen Token ..

+0

'$' ist ein Metacha racter bedeutet Ende des Musterraums, wenn es das letzte Zeichen im Muster ist. Überall sonst ist es buchstäblich '$'. In einigen Versionen von sed wird es auch das Ende des Musterbereichs sein, wenn es logisch ist der letzte Teil eines Musters, zB: 'abc \ ($ \ | def \)' – andlrc

+0

Die echte Abfrage wird in etwa so aussehen: sed ' /./= 'MYTXTTFILE.txt | sed '/./N; s/\ n// '| sed -ne 's/3 \ s. \ {70 \} \ (. \ {3 \} \) \ (. \ {25 \} \). \ {72 \} \ (. \ {15 \} \). */\, \ \ 1, \ 2, \ 3/p '| sed -e' s/\ s // g '-e's/VV /, V/g' Ich möchte das ändern Wenn also das vierte Token und das dritte Token nicht mit einem Komma enden, sollte ich einen Teilstring aus MYTXTTFILE.txt aus dem 5. bis 10. Spaltenindex der Datei extrahieren und am Ende einfügen. –

+0

Das Folgende funktioniert gut, außer dass ich das Ende durch "test" ersetze: sed '/./=' RO.txt | sed '/./N; s/\ n// '| sed -ne 's/3 \ s. \ {70 \} \ (. \ {3 \} \) \ (. \ {25 \} \). \ {72 \} \ (. \ {15 \} \). */\, \ \ 1, \ 2, \ 3/p '| sed -e's/\ s // g'-e's/VV /, V/g'-e's /, $ /, test/g ' Wenn ich jedoch Test mit Sub-String von sagen, 5. Index bis 10. Index von MYTXTFILE.txt ersetzen, funktioniert dies nicht .. –

Antwort

0
sed -r 's/(^.*,)(.{3})(.*)/\1\2\3\2/g' <<< "7518,32S,CDIYBMULKRQHTVNSE," 
7518,32S,CDIYBMULKRQHTVNSE,CDI 

oder nach, wenn Sie doppelte Anführungszeichen erhalten wollen:

sed -r 's/(^.*,)(.{3})(.*)/"\1\2\3\2"/g' <<< "7518,32S,CDIYBMULKRQHTVNSE," 
"7518,32S,CDIYBMULKRQHTVNSE,CDI" 
0

So etwas wie dies funktionieren könnte:

$ sed 's/,\(...\)[^,]*/&,\1/2' input.txt 
7518,32S,CDIYBMULKRQHTVNSE,CDI, 

Es wird das zweite Spiel der , von drei Zeichen gefolgt ersetzen:

7518,32S,CDIYBMULKRQHTVNSE, 
#  ^^^^^^^^^^^^^^^^^^ 
#  ||||   ^End of match 
#  |^^^ Captured in \1 
#  ^Start of match