有没有办法用sed将所有行附加到模式空间?

时间:2017-03-27 02:35:20

标签: linux sed

seq 5 | sed -En 'N;N;N;N;s/(.|\n)+/a/p'

我可以使用'a'替换整个内容。但我必须使用4 N命令来做到这一点。

有简单的方法吗? (我想要的是将所有行作为一行处理)

sed (GNU sed) 4.2.2

编辑:样本

seq 5将在下方显示5行,

1
2
3
4
5

我希望使用sed的s命令将5行解析为一行,如下所示:

echo -e "1\n2\n3\n4\n5" | sed -En 'N;N;N;N;s|regex|something|p'

但我不想使用这么多N命令,所以我需要一种聪明的方法将所有行附加到模式空间。

4 个答案:

答案 0 :(得分:2)

从表面上看,你所追求的可能是:

:a
$! N
$ b c
b a
:c
s/\n+/a/gp

将其保存在文件script.sed中。然后你可以运行:

$ seq 10 | sed -En -f script.sed
1a2a3a4a5a6a7a8a9a10
$

该脚本会创建一个标签a。对于除最后一行($!)之外的每一行,它都适用N。对于最后一行,它会跳转到标签c。否则,它会跳回标签a。标签c处的操作是将每个换行符替换为字母a,然后打印结果。

虽然您可以在参数中编写所有脚本,但sed的BSD(macOS)版本需要在他们自己的-e参数中使用两个标签,因此您最终会得到一个很多-e个参数(至少有四个;你可能还有自己的-e参数中的每一行)。 sed无法照顾;需要维护代码的人可能。

答案 1 :(得分:2)

这可能适合你(GNU sed):

sed '1h;1!H;$!d;x;s/./a/g' file

sed ':a;$!{N;ba};s/./a/g' file

两者都实现了相同的结果,第一个使用正常的程序流和保持空间,第二个只使用模式空间而是内部循环。

N.B。这将替换a之前的所有字符(包括换行符),如果不需要,则只替换换行符s/\n/a/g,删除换行符s/\n//g;s/./a/g或替换非换行符s/[^\n]/a/g

答案 2 :(得分:0)

也许这个?

seq 1 5 | sed 'H;$!d;x;s/\n/ /g;s/$/ a/'
 1 2 3 4 5 a

seq 1 5 | sed '1h;1!H;$!d;x;s/\n/<pattern space>/g;s/$/ a/'
1<pattern space>2<pattern space>3<pattern space>4<pattern space>5 a

请注意,在第1行使用h而不是H会阻止在第1行之前添加<pattern space>

答案 3 :(得分:0)

通常我会像这样啜饮整个输入:

seq 5 | sed -n 'H;${g;s/regex/something/p}'

至于我,它很容易重现;)