我在bash中有一个包含多行字符串的变量:
mystring="foo
bar
stack
overflow"
显然,当我echo "$mystring"
时,这会给你很多缩进。在python中我只需导入textwrap并在字符串上使用dedent,这就把我带到了这里。是否存在类似python的dedent模块,它存在于bash中?
答案 0 :(得分:2)
您可以使用sed从每行中删除前导空格:
$ sed 's/^[[:space:]]*//' <<< "$mystring"
foo
bar
stack
overflow
您可以选择(ab)use the fact that read will remove leading and trailing spaces:
$ while read -r line; do printf "%s\n" "$line"; done <<< "$mystring"
foo
bar
stack
overflow
在您的示例中,您基本上想要删除所有空格:
$ echo "${mystring// }"
foo
bar
stack
overflow
答案 1 :(得分:1)
“here document”功能允许将多行字符串定义为命令的输入:
$ cat <<_EOT_
Lorem ipsum dolor sit amet,
consectetur adipiscing elit.
Morbi quis rutrum nisi, nec dignissim libero.
_EOT_
Lorem ipsum dolor sit amet,
consectetur adipiscing elit.
Morbi quis rutrum nisi, nec dignissim libero.
Bash手册section on here documents描述了一个允许在源中缩进的选项,并在读取文本时将其删除:
此处文件
[...]
如果重定向运算符为
<<-
,则所有前导制表符都将从输入行和 包含分隔符的行。这允许shell脚本中的文档以自然方式缩进 方式。
看起来像这样:
$ cat <<-_EOT_
Lorem ipsum dolor sit amet,
consectetur adipiscing elit.
Morbi quis rutrum nisi, nec dignissim libero.
_EOT_
Lorem ipsum dolor sit amet,
consectetur adipiscing elit.
Morbi quis rutrum nisi, nec dignissim libero.
问题在于它将仅删除 TAB(U + 0009)缩进,而不是空格。如果您的编码风格禁止源代码中的TAB字符,则这是一个严重的限制: - (
答案 2 :(得分:0)
这是替代方法,用于在bash脚本中运行python dedent代码。
python_dedent_script="
import sys, textwrap
sys.stdout.write(textwrap.dedent(sys.stdin.read()))
"
function dedent_print() {
python -c "$python_dedent_script" <<< "$1"
}
dedent_print "
fun( abc,
def, ghi )
jkl
"
将输出:
fun( abc,
def, ghi )
jkl
答案 3 :(得分:-2)
不是缩进字符串,而是压缩导致缩进需要的初始换行符。
mystring="\
foo
bar
stack
overflow"