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,但是,如果你想把它打印到文本文件中,你需要添加最后一个缺少的换行符。
1条答案
按热度按时间j5fpnvbx1#
不,
sed
中的d
命令删除行中任何位置与地址表达式匹配的行。但是,在本例中,正则表达式通过$
锚点锚定到行的 end。因此,它删除最后一个字符与字符类匹配的行(a-z
、A-Z
或0-9
范围内的任何字符)。按照习惯用法,
cut
更好的表达方式是将其重构到sed
脚本中;您通常希望最小化创建的子进程的数量。您可以通过切换到
line.endswith(...)
来避免使用正则表达式,但是...
将比这个简单的正则表达式更冗长。打印变量的正确方法包括引用变量:
echo "$var"
。我猜省略引号是一个错误,而不是故意的。特别是,如果var
包含多行文本,引号的缺失会迫使所有文本打印在一行中。还有其他问题。另请参见When to wrap quotes around a shell variable当然,如果变量真的只包含一行文本,您可以避免
splitlines()
和循环,而直接检查变量。命令替换将从结果中删除任何尾随的换行符,所以
example
中缺少最后一个换行符在这里不是bug,但是,如果你想把它打印到文本文件中,你需要添加最后一个缺少的换行符。