Sed包裹了一些线,而不是全部

时间:2011-03-16 20:59:04

标签: sed

仍在处理古怪的文件(参见my previous post),我正在使用SED来清理一些如下所示的文件:

....Receiver ID   = 028912781755
    Serial Number = WD-WCAUH0546786
    Current temp  = 50C
    PowerOnHours  = 13166h
    Receiver ID   = 028920310381
    Serial Number = WD-WCAUH0898333
    Current temp  = 51C
    PowerOnHours  = 9099h...

我的老板希望像这样的文件是tab(“\ t”)这样的分隔

Receiver ID = 028912781755 Serial Number = WD-WCAUH0546786 Current temp  = 50C PowerOnHours  = 13166h

这是我的sed代码:

sed -e '/.$/N; s/.\n/\t/'

它有效,但奇怪的是,并非无处不在。这是我得到的输出

Receiver ID   = 028920310381 Serial Number = WD-WCAUH0898333 
Current temp  = 51 PowerOnHours  = 9099h

=============================================== ======================= 我需要更具体。我得到的所有建议产生了相同的结果:它将所有内容单独添加到一行。不是我想要的。

我正在寻找:

Receiver ID = ...<tab>Serial Number = ...<tab>Current temp  = ...<tab>PowerOnHours  = ...<tab><carriage return>
Receiver ID = ...<tab>Serial Number = ...<tab>Current temp  = ...<tab>PowerOnHours  = ...<tab> 

6 个答案:

答案 0 :(得分:2)

字段数有所不同,但以PowerOnHours结尾

awk 'ORS=/PowerOnHours/?RS:"\t"' ./infile

概念证明

$ awk 'ORS=/PowerOnHours/?RS:"\t"' receiverid
Receiver ID   = 028912781755    Special Field = foo bar baz     Serial Number = WD-WCAUH0546786 Current temp  = 50C     PowerOnHours  = 13166h
Receiver ID   = 028920310381    Serial Number = WD-WCAUH0898333 Current temp  = 51C     PowerOnHours  = 9099h
Receiver ID   = 028912781755    Serial Number = WD-WCAUH0546786 Current temp  = 50C     PowerOnHours  = 13166h
Receiver ID   = 028920310381    Serial Number = WD-WCAUH0898333 Current temp  = 51C     PowerOnHours  = 9099h

*请注意第一行特殊字段


记录之间的字段数相同

awk 'ORS=NR%4?"\t":RS' ./infile

概念证明

$ awk 'ORS=NR%4?"\t":RS' ./infile
Receiver ID   = 028912781755    Serial Number = WD-WCAUH0546786 Current temp  = 50C     PowerOnHours  = 13166h
Receiver ID   = 028920310381    Serial Number = WD-WCAUH0898333 Current temp  = 51C     PowerOnHours  = 9099h
Receiver ID   = 028912781755    Serial Number = WD-WCAUH0546786 Current temp  = 50C     PowerOnHours  = 13166h
Receiver ID   = 028920310381    Serial Number = WD-WCAUH0898333 Current temp  = 51C     PowerOnHours  = 9099h

答案 1 :(得分:1)

尝试一下:

sed '/^Receiver/N;N;N;s/\n/\t/g' inputfile

说明:

  • /^Receiver/N;N;N; - 每次读取以“Receiver”开头的行时,请追加接下来的三行。
  • s/\n/\t/g - 使用标签
  • 替换嵌入的换行符

示例输出:

Receiver ID   = 028912781755        Serial Number = WD-WCAUH0546786        Current temp  = 50C        PowerOnHours  = 13166h
Receiver ID   = 028920310381        Serial Number = WD-WCAUH0898333        Current temp  = 51C        PowerOnHours  = 9099h

(我夸大了标签的效果。)

答案 2 :(得分:1)

你可以使用awk

$ cat  file
Receiver ID   = 028912781755
Serial Number = WD-WCAUH0546786
Current temp  = 50C
PowerOnHours  = 13166h
Receiver ID   = 028920310381
Serial Number = WD-WCAUH0898333
Current temp  = 51C
PowerOnHours  = 9099h...

$ awk 'BEGIN{RS="Receiver";OFS="\t"}NF>1{$1=$1;print "Receiver\t"$0}' file
Receiver        ID      =       028912781755    Serial  Number  =       WD-WCAUH0546786 Current temp    =       50C     PowerOnHours    =       13166h
Receiver        ID      =       028920310381    Serial  Number  =       WD-WCAUH0898333 Current temp    =       51C     PowerOnHours    =       9099h...

答案 3 :(得分:1)

sed ':a          
N;/\nReceiver/{
P;D
}          
s/\n/X/;ta'

答案 4 :(得分:0)

如上所述,将第二行连接到第一行,然后转到第三行并将第四行连接到它等等。

sed ':b; /^$/n; N; s/.\n\(.\)/\t\1/; tb'

应该循环追加非空行。 (更正为在运行中实际捕获空白行。)

答案 5 :(得分:0)

cat file | tr '\n' '\t' 也会工作

相关问题