我有一个脚本,用四个空格缩进文本:
echo ${SOMETHING} | sed 's/^/ /g'
我的IDE抱怨我在正则表达式中使用了四个连续的空格。
有没有办法重写这个告诉sed,“[space] * 4”?
引用这可能是一个更基本的问题。 (我不能和你的'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确实如此。)
最后,你可以使用seq
或printf
来获得一个字符的复制(即,用于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