linux 将多命令管道bash转换为python

xu3bshqb  于 2023-01-04  发布在  Linux
关注(0)|答案(1)|浏览(110)

这是我的bash脚本中包含的内容:
example=$(echo $var | cut -c 40- | sed "/[a-zA-Z0-9]$/!d").我正在试着把它翻译成python。
在Python中,echo $var | cut -c 40-会给予print(var[40])
我知道[a-zA-Z 0 -9]表示a-z、A-Z或0-9范围内的任何字符。那么sed "/[a-zA-Z0-9]$/!d"是否删除以[a-zA-Z 0 -9]开头的每一行呢?

j5fpnvbx

j5fpnvbx1#

不,sed中的d命令删除行中任何位置与地址表达式匹配的行。但是,在本例中,正则表达式通过$锚点锚定到行的 end。因此,它删除最后一个字符与字符类匹配的行(a-zA-Z0-9范围内的任何字符)。
按照习惯用法,cut更好的表达方式是将其重构到sed脚本中;您通常希望最小化创建的子进程的数量。

import re

example = "\n".join(line[40:] for line in var.splitlines()
    if len(line) > 40 and re.search(r'[a-zA-Z0-9]$', line))

您可以通过切换到line.endswith(...)来避免使用正则表达式,但是...将比这个简单的正则表达式更冗长。
打印变量的正确方法包括引用变量:echo "$var"。我猜省略引号是一个错误,而不是故意的。特别是,如果var包含多行文本,引号的缺失会迫使所有文本打印在一行中。还有其他问题。另请参见When to wrap quotes around a shell variable
当然,如果变量真的只包含一行文本,您可以避免splitlines()和循环,而直接检查变量。
命令替换将从结果中删除任何尾随的换行符,所以example中缺少最后一个换行符在这里不是bug,但是,如果你想把它打印到文本文件中,你需要添加最后一个缺少的换行符。

相关问题