2017-03-29 413 views
2

我有這個文件替換sed命令文本內嵌

file.txt的

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

我如何使用sed命令來獲得這樣的:

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

回答

1

這可能爲你工作(GNU SED):

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

啜食文件放入模式空間和替代品,替代品,印刷品之一的第一部分,並刪除第一行,然後重複。

+0

這是完美的工作! THK –

1

好了,這確實使用sed無論如何:

{ 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來救援!

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

雙通道算法,緩存第一輪中的條目並將它們插入到空字段中,假設條目數匹配。

這裏是包裹着一個通過另一種方法,搭載tacawk

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

我會相關線路與paste結合,洗牌與awk元素(我假設相關的線是完全相同半個文件離開):

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='|' 

輸出:

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