将含sed、rev的Shell命令转换为Python脚本求助
将Shell脚本的参数提取逻辑转换为Python实现
一、先搞懂Shell里sed、rev、cut的作用(针对你的场景)
假设你的Shell脚本里提取参数的逻辑是这两类操作,对应解释:
- sed:核心是字符串替换,比如
sed 's/.*TEST_CASE=//'就是把行里TEST_CASE=之前的所有内容删掉,只保留后面的参数值; - rev:把整行字符串反转,比如
abc=TEST_CASE会变成ESAC_TSET=cba; - cut:按指定分隔符截取字段,比如
cut -d'=' -f1就是按=分割后取第一个字段。结合rev用的话,一般是为了取行中最后一个=后面的值——先反转行,取第一个=前面的内容,再反转回来,本质就是拿到最后一个=后的参数。
二、Python完整实现步骤
1. 遍历指定目录下的所有.vrlp文件
你已经用os.walk搭了框架,这里补全完整遍历逻辑:
import os import re # 把相对路径转成绝对路径,避免目录切换问题(Python不需要像Shell那样cd) target_dir = os.path.abspath("../../../tests/src/main/test") # 遍历所有子目录,筛选.vrlp文件 for root, _, files in os.walk(target_dir): for file in files: if file.endswith(".vrlp"): full_path = os.path.join(root, file) # 对每个文件执行参数提取 extract_params(full_path)
2. 实现参数提取逻辑(替代sed/rev/cut)
根据两种常见的参数格式,提供对应的Python实现:
场景1:参数行格式为TEST_CASE=xxx或CLASS=xxx(单行单参数)
用正则匹配最稳妥,能兼容参数前后有空格的情况:
def extract_params(file_path): # 正则模式:匹配TEST_CASE/CLASS,允许前后空格,捕获后面的参数值 param_pattern = re.compile(r'(TEST_CASE|CLASS)\s*=\s*(.+)') try: with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() match_result = param_pattern.match(line) if match_result: param_name = match_result.group(1) param_value = match_result.group(2).strip() # 这里可以替换成你需要的逻辑:存储到字典、写入文件等 print(f"[{file_path}] {param_name}: {param_value}") except Exception as e: print(f"处理文件 {file_path} 出错: {str(e)}")
场景2:参数在行尾,需要取最后一个=后面的值(对应rev+cut的场景)
如果参数行是类似prefix=abc TEST_CASE=my_test这种格式,要拿最后一个=后的内容,用字符串处理即可:
def extract_params(file_path): target_params = {'TEST_CASE', 'CLASS'} try: with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() for param in target_params: if param in line: # 找到最后一个=的位置,截取后面的内容 last_eq_pos = line.rfind('=') if last_eq_pos != -1: param_value = line[last_eq_pos+1:].strip() print(f"[{file_path}] {param}: {param_value}") break except Exception as e: print(f"处理文件 {file_path} 出错: {str(e)}")
3. 完整整合代码
把遍历和提取逻辑结合,加上目录合法性校验:
import os import re def extract_params(file_path): param_pattern = re.compile(r'(TEST_CASE|CLASS)\s*=\s*(.+)') try: with open(file_path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() match_result = param_pattern.match(line) if match_result: param_name = match_result.group(1) param_value = match_result.group(2).strip() print(f"[{file_path}] {param_name}: {param_value}") except Exception as e: print(f"处理文件 {file_path} 出错: {str(e)}") def main(): target_dir = os.path.abspath("../../../tests/src/main/test") if not os.path.isdir(target_dir): print(f"错误:目标目录 {target_dir} 不存在") return for root, _, files in os.walk(target_dir): for file in files: if file.endswith(".vrlp"): full_path = os.path.join(root, file) extract_params(full_path) if __name__ == "__main__": main()
三、关键说明
- Python不需要像Shell那样
cd到目标目录,直接用绝对路径处理文件即可; - 正则匹配比字符串分割更灵活,能兼容参数前后的空格、换行符等异常格式;
- 加入异常处理,避免单个文件读取失败导致整个脚本中断。
内容的提问来源于stack exchange,提问作者user21072203
相关产品推荐
相关产品推荐

