2017-03-29 8 views
2

ich diese Dateiersetzen sed Befehl Text inline

datei.txt

[email protected]||[email protected]|| 
[email protected]||[email protected]|| 
[email protected]||[email protected]|| 
[email protected]||[email protected]|| 
unknownpass 
unknownpass2 
unknownpass3 
unknownpass4 

haben Wie kann ich den sed Befehl verwenden, um dies zu erhalten:

[email protected]|unknownpass|[email protected]|unknownpass| 
[email protected]|unknownpass2|[email protected]|unknownpass2| 
[email protected]|unknownpass3|[email protected]|unknownpass3| 
[email protected]|unknownpass4|[email protected]|unknownpass4| 

Antwort

1

Dies könnte für Sie arbeiten (GNU sed):

sed ':a;N;/\n[^|\n]*$/!ba;s/||\([^|]*\)||\(\n.*\)*\n\(.*\)$/|\3|\1|\3|\2/;P;D' file 

Slurp der erste Teil der Datei in Musterraum und eines der Ersatz, Ersatz, drucken und löschen Sie die erste Zeile und dann wiederholen.

+0

Es funktioniert perfekt! thk –

1

Nun, das sed nicht verwendet trotzdem:

{ sed -n 5,\$p file.txt; sed 4q file.txt; } | awk 'NR<5{a[NR]=$0; next} 
     {$2=a[NR-4]; $4=a[NR-4]} 1' FS=\| OFS=\| 
1

awk zur Rettung!

awk 'BEGIN {FS=OFS="|"} 
    NR==FNR {if(NF==1) a[++c]=$1; next} 
    NF>4 {$2=a[FNR]; $4=$2; print}' file{,} 

ein Zweifachdurchlauf-Algorithmus, speichert die Einträge in der ersten Runde und fügt sie in die leeren Felder, nimmt die Anzahl der Elemente Spiel.

ist hier ein anderer Ansatz mit einem Durchgang, angetrieben durch tac gewickelten awk

tac file | 
awk 'BEGIN {FS=OFS="|"} 
    NF==1 {a[++c]=$1} 
    NF>4 {$2=a[c--]; $4=$2; print}' | 
tac 
0

ich die damit verbundenen Linien mit paste verbinden würde und die Elemente mit awk Umbildung (ich nehme an den entsprechenden Linien sind genau eine halbe Datei entfernt):

n=$(wc -l < file.txt) 
paste -d'|' <(head -n $((n/2)) file.txt) <(tail -n $((n/2)) file.txt) | 
awk '{ print $1, $6, $3, $6, "" }' FS='|' OFS='|' 

Ausgang:

[email protected]|unknownpass|[email protected]|unknownpass| 
[email protected]|unknownpass2|[email protected]|unknownpass2| 
[email protected]|unknownpass3|[email protected]|unknownpass3| 
[email protected]|unknownpass4|[email protected]|unknownpass4|