如何用regex / sed复制一个角色

问题描述 投票:0回答:1

我有一个脚本,用四个空格缩进文本:

echo ${SOMETHING} | sed 's/^/ /g'

我的IDE抱怨我在正则表达式中使用了四个连续的空格。

有没有办法重写这个告诉sed,“[space] * 4”?

regex sed
1个回答
-1
投票

引用这可能是一个更基本的问题。 (我不能和你的'IDE'说话,因为我觉得这是无关的。)

你有echo ${SOMETHING}。这应该是echo "${SOMETHING}"或shell将解释字符串和扩展定义的间距将丢失。 (另外,你应该避免对Bash变量使用CAPS。按惯例保留这些变量用于Bash的使用。)

例:

$ something="123
> 456
> 789"

现在,引用:

$ echo "$something" 
123
456
789

无:

$ echo $something
123 456 789

现在,用于缩进这些行的sed按预期工作:

$ echo "$something" | sed 's/^/   /'
   123
   456
   789

此外,替换文本是一个简单的字符串(除了对捕获组或某些C样式反斜杠扩展的解释。)所以像s/^/ {4}/这样的东西不起作用。您还应该了解sed是面向行的(逻辑范围操作除外),因此g中的s/^/ /g什么都不做。每行只有一个替换。 (使用Perl进行多行替换。)

要有一些可定义的缩进,现在使用Bash字符串解释为您的利益:

$ indent=$'\t=>\t'
$ echo "$something" | sed "s/^/$indent/"
    =>  123
    =>  456
    =>  789

$'\t=>\t'是ANSI C引用,支持各种C backslash definitions。您需要将sed脚本更改为",以便$indent中的值由Bash解释,然后添加到sed脚本中。 (注意:POSIX sed在替换模式中不支持\n.GNU sed确实如此。)

最后,你可以使用seqprintf来获得一个字符的复制(即,用于sed的[space]*6

$ indent=$(seq -f " " -s '' 6)
$ echo "$something" | sed "s/^/$indent/"
      123
      456
      789

要么,

$ indent=$(printf "%6s")
$ echo "$something" | sed "s/^/$indent/"
      123
      456
      789
© www.soinside.com 2019 - 2024. All rights reserved.