替换sed命令文本内联

时间:2017-03-29 22:44:45

标签: linux bash sed replace

我有这个文件

file.txt的

unknown@mail.com||unknown@mail.com||
unknown@mail2.com||unknown@mail2.com||
unknown@mail3.com||unknown@mail3.com||
unknown@mail4.com||unknown@mail4.com||
unknownpass
unknownpass2
unknownpass3
unknownpass4

如何使用sed命令获取此信息:

unknown@mail.com|unknownpass|unknown@mail.com|unknownpass|
unknown@mail2.com|unknownpass2|unknown@mail2.com|unknownpass2|
unknown@mail3.com|unknownpass3|unknown@mail3.com|unknownpass3|
unknown@mail4.com|unknownpass4|unknown@mail4.com|unknownpass4|

4 个答案:

答案 0 :(得分: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 :(得分:1)

awk救援!

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

两遍算法,缓存第一轮中的条目并将其插入空字段,假设项目数匹配。

这是另一种方法,一次通过,由tac包裹awk

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

答案 2 :(得分:1)

这可能适合你(GNU sed):

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

将文件的第一部分拖入图案空间,然后替换,替换,打印和删除第一行,然后重复。

答案 3 :(得分: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='|'

输出:

unknown@mail.com|unknownpass|unknown@mail.com|unknownpass|
unknown@mail2.com|unknownpass2|unknown@mail2.com|unknownpass2|
unknown@mail3.com|unknownpass3|unknown@mail3.com|unknownpass3|
unknown@mail4.com|unknownpass4|unknown@mail4.com|unknownpass4|