将Bash多命令管道脚本转Python及sed命令含义咨询
Bash脚本转Python及sed命令解析
先纠正你对sed "/[a-zA-Z0-9]$/!d"的误解
这个sed命令不是删除以字母数字开头的行,而是只保留以字母(a-z/A-Z)或数字(0-9)结尾的行,其余所有行都会被删掉。具体逻辑:
/[a-zA-Z0-9]$/是匹配规则:$代表行尾,整个模式匹配行最后一个字符是字母或数字的行!d是执行动作:!表示取反,d是删除,合起来就是“不匹配上述规则的行全部删除”
原Bash脚本的完整逻辑
example=$(echo $var | cut -c 40- | sed "/[a-zA-Z0-9]$/!d") 一步步做了这些事:
- 输出变量
var的内容(如果是多行就按行输出) - 对每一行,截取从第40个字符开始到行尾的部分(Bash里
cut -c 40-的字符计数是从1开始的) - 过滤掉所有不以字母/数字结尾的行,把剩下的内容赋值给
example
对应的Python实现
注意:Python的字符串索引是从0开始的,所以Bash里的第40个字符对应Python的索引39;另外要考虑多行文本的场景:
处理多行文本的版本
# 假设var是原始的输入字符串(可能包含多行) lines = var.splitlines() filtered = [] for line in lines: # 截取第40个字符及之后的内容,长度不够40就取空字符串 truncated = line[39:] if len(line) >= 40 else "" # 过滤:只有非空且最后一个字符是字母/数字的行才保留 if truncated and truncated[-1].isalnum(): filtered.append(truncated) # 把过滤后的行用换行符连接,得到最终的example example = "\n".join(filtered)
处理单行文本的简化版本
# 假设var是单行字符串 truncated = var[39:] if len(var) >= 40 else "" # 符合条件就保留,否则为空 example = truncated if (truncated and truncated[-1].isalnum()) else ""
内容的提问来源于stack exchange,提问作者answer007
相关产品推荐
相关产品推荐

