7

我是初学者sed。我知道可以将一个命令(或一组命令)应用于一定范围的行,就像这样

sed '/[begin]/,/[end]/ [some command]'

where[begin]是指定范围开始行的[end]正则表达式,是指定范围结束行(但包含在范围内)的正则表达式。

我正在尝试使用它来指定文件中的一系列行并将它们全部加入一行。这是我最好的尝试,但没有奏效:

sed '/[begin]/,/[end]/ {
N
s/\n//
}
'

我可以毫无问题地选择我想要的一组行,但我似乎无法将它们全部合并到一行中。如果有人能指出我正确的方向,我将不胜感激。

4

3 回答 3

5

一种使用方式GNU sed

sed -n '/begin/,/end/ { H;g; s/^\n//; /end/s/\n/ /gp }' file.txt
于 2012-09-24T04:27:53.880 回答
2

如果您想选择一些线并加入它们,这很简单。使用史蒂夫的答案或我的 pipe-to-tr 替代方案:

sed -n '/begin/,/end/p' | tr -d '\n'

如果您还想保留其他行,这会变得有点棘手。这是我的做法(使用 GNU sed):

加入.sed

/\[begin\]/ {
  :a
  /\[end\]/! { N; ba }
  s/\n/ /g
}

所以这里的逻辑是:

  1. [begin]遇到行时,开始使用循环将行收集到模式空间中。
  2. 发现时[end]停止收集并加入行列。

例子:

seq 9 | sed -e '3s/^/[begin]\n/' -e '6s/$/\n[end]/' | sed -f join.sed

输出:

1
2
[begin] 3 4 5 6 [end]
7
8
9
于 2012-09-24T09:24:41.407 回答
1

我喜欢你的问题。我也喜欢塞德。很遗憾,我不知道如何在 Sed 中回答您的问题;所以,和你一样,我在这里寻找答案。

由于这里还没有出现 Sed 的答案,下面是如何在 Perl 中执行此操作:

perl -wne 'my $flag = 0; while (<>) { chomp; if (/[begin]/) {$flag = 1;} print if $flag; if (/[end]/) {print "\n" if $flag; $flag = 0;} } print "\n" if $flag;'
于 2012-09-24T04:08:03.790 回答