如何在 sed 替换表达式(缩进文本)中使用量词?

如何在 sed 替换表达式(缩进文本)中使用量词?

我用来| 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,有点a goto
  • /^ \{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'

将替换运行为可执行语句并使用结果作为subbed值。 (在这种情况下,我通过使用得到 10 )重复运算符, x)

答案4

您可以让 shell 生成 10 个空格的序列。

例如,与zsh

$ echo something | sed "s/^/${(l[10])}/"
          something

这里使用left padding 参数扩展标志应用于空参数扩展。您也可以r在这里使用右边的那个。用不同的字符填充:

$ echo something | sed "s/^/${(l[10][.])}/"
..........something

甚至字符序列:

$ echo something | sed "s/^/${(l[10][<>])}/"
<><><><><>something

相关内容