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
命令,所以我需要一种聪明的方法将所有行附加到模式空间。
答案 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}'
至于我,它很容易重现;)