sed取代范围

时间:2016-02-04 13:11:43

标签: bash sed

我的文件包含以下条目:

abc
def
ghi
jkl
mno
pqr
stu
vwx
yz1
234
567
890

sed表达式将从前10行中删除尾随换行符是什么?

感谢。

6 个答案:

答案 0 :(得分:5)

我会说

sed '1,9 { H; d; }; 10 { x; G; s/\n//g; }' filename

这是做什么的:

1,9 {            # For the first nine lines:
  H              # append line to hold buffer
  d              # then discard it.
}
10 {             # in the tenth line:
  x              # swap the assembled lines in the hold buffer with the pattern
                 # space containing the tenth line
  G              # append hold buffer (holding the tenth line) to the pattern
                 # space (holding the previous nine lines)
  s/\n//g        # remove all newlines from that.
}

可替换地,

sed '1 { N;N;N;N;N;N;N;N;N; s/\n//g; }' filename

也会奏效。处理第一行时,它会获取接下来的九行(使用九个N命令),然后删除它们之间的换行符。但是,我觉得这不太容易适应,因此不太漂亮。

答案 1 :(得分:2)

使用perl,chomp删除换行符。

perl -pe 'chomp if $. < 10' file

abcdefghijklmnopqrstuvwxyz1234
567
890

答案 2 :(得分:1)

我认为可以在没有sed的情况下完成。

head file -n 10 | tr -d '\n'; tail file -n +11

答案 3 :(得分:1)

POSIXly:

# With GNU sed, you need `sed -u`.
{ sed 'N;N;N;N;N;N;N;N;N;s/\n//g;q'; cat -; } <file

或:

awk 'FNR < 10 {printf "%s", $0; next};1' file

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed '11,$b;1h;1!H;10!d;g;s/\n//g' file

从第11行到文件末尾(也可以是文字1,10!b)纾困并正常打印。将第一行存储在保留空间中。在保留空间中追加第2到10行。删除第1行到第9行。用保留空格替换第10行,删除所有换行符并打印。

答案 5 :(得分:-1)

sed用于单个行上的简单替换,即全部。对于其他任何你应该使用awk:

$ awk '{ORS=(NR<10?OFS:RS)}1' file
abc def ghi jkl mno pqr stu vwx yz1 234
567
890

$ awk '{ORS=(NR<5?OFS:RS)}1' file
abc def ghi jkl mno
pqr
stu
vwx
yz1
234
567
890

$ awk '{ORS=(NR>3 && NR<7 ? OFS : RS)}1' file
abc
def
ghi
jkl mno pqr stu
vwx
yz1
234
567
890