在bash中,与python的textwrap dedent等价的方法是什么?

23 浏览
0 Comments

在bash中,与python的textwrap dedent等价的方法是什么?

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

mystring="foo
          bar
          stack
          overflow"

显然,当我echo "$mystring"时会产生大量的缩进。在Python中,我只需导入textwrap并在字符串上使用dedent,这就是我来到这里的原因。是否存在类似于Python的dedent模块的bash版本?

0
0 Comments

在这段代码中,作者想要在bash脚本中运行python的dedent代码,以实现类似于python的textwrap.dedent()的功能。然而,在bash中并没有类似于dedent的内置函数,因此需要编写一段python代码来实现该功能,并在bash脚本中调用该代码。

作者首先定义了一个名为"python_dedent_script"的变量,该变量包含了一段python代码。这段代码导入了sys和textwrap两个模块,并定义了一个函数dedent_print()。这个函数的功能是接收一个字符串作为输入,利用textwrap.dedent()函数对输入的字符串进行处理,然后输出处理后的结果。该函数的实现是通过调用python的-c选项来执行python代码的方式。

接下来,作者在bash脚本中调用了dedent_print()函数,并将一个包含了多行字符串的变量作为参数传递给该函数。这个多行字符串包含了一个函数调用和一些参数,函数调用的格式并不规范,每个参数都前面带有多余的空格和换行符。作者想要通过调用dedent_print()函数来去除这些多余的空格和换行符。

最后,作者通过调用dedent_print()函数,并将包含多行字符串的变量作为参数传递给该函数,来实现去除多余空格和换行符的功能。输出结果是经过处理后的字符串,其中多余的空格和换行符被去除了。

至于为什么在python代码中使用write和read方法而不是print和input函数,作者解释道,这样做可以增加代码的兼容性。使用write和read方法可以使代码同时适用于python 2和python 3,而使用print和input函数就需要编写if-else语句来适配不同的python版本。

0
0 Comments

在Bash中,可以使用"here document"功能将多行字符串定义为命令的输入。然而,Bash手册中的"here document"部分描述了一种选项,允许在源代码中进行缩进,并在读取文本时将其去除。这样可以使脚本中的"here document"按照自然的方式进行缩进。

然而,该选项只会去除制表符(TAB,U+0009)缩进,而不会去除空格缩进。这对于那些禁止在源代码中使用制表符的编码风格来说是一个严重的限制。

尽管如此,在Ubuntu 18.04中,我尝试使用Bash,但那些前导制表符仍然存在。对此我感到抱歉。

因此,问题是如何在Bash中实现与Python的textwrap dedent相当的功能。解决方法是使用sed命令来处理字符串,去除每行开头的空格缩进。

以下是解决方法的示例代码:

text=$(cat <<-_EOT_
    Lorem ipsum dolor sit amet,
        consectetur adipiscing elit.
    Morbi quis rutrum nisi, nec dignissim libero.
_EOT_
)
dedented_text=$(echo "$text" | sed -e 's/^[[:blank:]]*//')
echo "$dedented_text"

这样就可以将文本中的空格缩进去除了。

以上就是在Bash中实现与Python的textwrap dedent相当的功能的原因和解决方法。通过使用sed命令去除每行开头的空格缩进,可以达到相同的效果。这对于那些在源代码中禁止使用制表符的编码风格来说是一个有效的解决方案。

0
0 Comments

问题出现的原因是在bash中没有类似于Python的textwrap dedent功能,即没有直接去除字符串中每行开头的空格的内置函数或命令。然而,在某些情况下,我们可能需要在bash中进行类似的操作,以便处理字符串中的空格。

为了解决这个问题,我们可以使用sed命令来删除每行开头的空格。通过使用正则表达式,我们可以匹配并替换每行开头的空格。下面是一个示例:

$ sed 's/^[[:space:]]*//' <<< "$mystring"
foo
bar
stack
overflow

另一种方法是滥用read命令的特性,该命令会去除每行开头和结尾的空格。我们可以使用while循环和read命令来逐行读取字符串,并打印每行内容。这样就可以达到去除每行开头空格的效果。下面是一个示例:

$ while read -r line; do printf "%s\n" "$line"; done <<< "$mystring"
foo
bar
stack
overflow

在需要去除所有空格的情况下,我们可以使用字符串替换的方式来实现。bash提供了一种字符串替换的语法,可以用来替换字符串中的指定字符。例如,我们可以使用以下命令将字符串中的所有空格替换为空字符串:

$ echo "${mystring// }"
foo
bar
stack
overflow

如果我们希望将上述操作封装成一个函数,可以这样做。下面是一个示例:

function dedent() {
    local string="$1"
    local trimmed=""
    while IFS= read -r line; do
        trimmed+="$(printf "%s\n" "$line")"
    done <<< "$string"
    echo "$trimmed"
}
# 使用示例
mystring="    foo
    bar
    stack
    overflow"
result=$(dedent "$mystring")
echo "$result"

需要注意的是,如果问题要求类似于Python的textwrap dedent功能,即保留缩进效果,那么上述解决方法并不能满足要求。在这种情况下,需要使用其他方法来实现,如在提到的Stack Overflow答案中所示(stackoverflow.com/a/63228433/724752)。

总结起来,在bash中实现类似于Python的textwrap dedent功能可以使用sed命令、while循环和read命令以及字符串替换的方式。具体选择哪种方法取决于需要实现的具体功能和要求。

0