相当于bash中python的textwrap dedent

时间:2016-06-17 19:16:03

标签: python string bash format

我在bash中有一个包含多行字符串的变量:

mystring="foo
          bar
          stack
          overflow"

显然,当我echo "$mystring"时,这会给你很多缩进。在python中我只需导入textwrap并在字符串上使用dedent,这就把我带到了这里。是否存在类似python的dedent模块,它存在于bash中?

4 个答案:

答案 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"