我用来| sed
缩进某些命令的结果(让我们以简单的$ echo something
例子为例)。我想在结果前面加上 10 个空格。以下工作正常:
$ echo something | sed 's/^/ /'
something
但是有没有办法在| sed
表达式中使用量词呢?
我尝试过例如
$ echo something | sed 's/^/ {10}/'
{10}something
但显然这是行不通的。{10}
不被解释为量词。
用反斜杠保护大括号也不起作用:
$ echo something | sed 's/^/ \{10\}/'
{10}something
有没有办法在替换表达式中使用量词?
答案1
我认为这是不可能的,因为替换中的替换sed
不是正则表达式。
另一种方法是创建一个变量并将其用作替换,如下所示:
# use printf to set as many spaces as you want
$ i=$(printf "%10s")
# use the created variable as replacement of the substitution
$ echo something | sed "s/^/$i/"
something
答案2
很多好的解决方案,我特别喜欢@nezabudka的| pr -T -o10
解决方案,非常简短。
现在,为了好玩,我找到了一个“sed
唯一”的解决方案(不printf
,不expand
,什么都没有):
$ echo something | sed ':L; /^ \{10\}/! {s/^/ /;b L}'
something
编辑:应@Barmar 的要求,一些解释:
:L;
创建一个名为的标签L
(你可以随意命名)- 我们在行首添加一个空格,并带有
s/^/ /
.然后我们回到标签(b L
,我们b
牧场到标签L
,有点agoto
) /^ \{10\}/!
我们将此表达式设为有条件的:仅当该行不以 10 个空格 ( )开头时才会执行
因此,基本上,我们重复“在行首添加一个空格”,直到该行以 10 个空格开头
虽然 @nezabudka 的pr
解决方案显然是在行前添加空格的最简单方法,但该sed
解决方案更加通用。例如,XYZ-
在一行前面添加 5 次:
$ echo something | sed ':L; /^\(XYZ-\)\{5\}/! {s/^/XYZ-/;b L}'
XYZ-XYZ-XYZ-XYZ-XYZ-something
答案3
Perl 的一些最好的东西是从 sed 偷来的,因此相似之处可能很有用。在这种情况下,perl 解决方案更简单,也许以这种方式思考可能会使 sed 解决方案变得显而易见。你想要的是打印 10 个空格进而打印输出,而不是转换行并打印结果。
echo something | perl -pe 'print " " x 10'
该-p
标志将隐式添加print $_
到命令末尾。
如果您确实想使用正则表达式,请使用该/e
标志
echo something | perl -pe 's/^/" " x 10/e'
答案4
您可以让 shell 生成 10 个空格的序列。
例如,与zsh
:
$ echo something | sed "s/^/${(l[10])}/"
something
这里使用l
eft padding 参数扩展标志应用于空参数扩展。您也可以r
在这里使用右边的那个。用不同的字符填充:
$ echo something | sed "s/^/${(l[10][.])}/"
..........something
甚至字符序列:
$ echo something | sed "s/^/${(l[10][<>])}/"
<><><><><>something