首页 > 解决方案 > python的grep、awk和sed替代品?

问题描述

os.system(r"grep -R 'Webpage\|Thumbnail' tmp | awk -F ' ' '{print $2}' | sed '1~2s/\(.*\)/]\[img]\1\[\/img]\[\/URL]/g ; N;s/\(.*\)\n\(.*\)/\2\1/ ; s/^/\[URL=/' | tr -d '[:space:]' > ./" + t + ".files/bbcode.txt")

它在做什么,grep 与 tmp 中的关键字行 > awk 在空格分隔符处拆分以获取关键字之后的所有内容 > sed 在开始时添加“[img]”,在每行末尾添加“[/img][/URL]”> sed 在每第二行的末尾添加“[URL=”开始和“]”> 将所有奇数行移动到所有偶数行的开头> 删除所有空格并合并成一个大行。

请有人指出我在python中执行此操作的正确方向吗?

标签: python-3.xawksedre

解决方案


这是一个简单的 Python 替代品。

  • grep -R将递归搜索目标目录中的常规文件。这可以替换为os.walk('tmp')。请记住,第三个结果只是os.walk文件名;你必须把每个目录前面的目录粘回去。
  • 在 Unix 命令行工具中,字段通常从 1 开始编号,而 Python 的索引是从零开始的。所以该行的第二个字段是line.split(' ')[1],不是line.split(' ')[2]
  • 如果无法访问您的文件,我不得不猜测sed脚本真正接收的输入是什么。我假设每一秒输出都是一个“网页”,而每隔一个输出是一个“缩略图”。

切线地,管道 Awk 到sedandtr基本上是无用的;Awk 可以完成这两个工具本身可以完成的所有事情(尽管sed在 Awk 中可能很难重新实现一个重要的脚本——但这不是一个例子。它1~2是一个 GNUsed扩展,所以这从一开始就不是很便携,并且在 Awk 中会更容易阅读和理解。)。相反,使用 Awk 在单个空间上拆分有点过分了。cut -d ' ' -f2将是一种更经济和简洁的方式来做到这一点。

import os

with open(t + ".files/bbcode.txt", "w") as bbcode:
    for root, dirs, files in os.walk('tmp'):
        for file in files:
            with open(os.path.join(root, file)) as lines:
                idx = 0
                for line in lines:
                    if 'Webpage' in line or 'Thumbnail' in line:
                        idx += 1
                        field = line.split(' ')[1]
                        if idx % 2 == 1:
                            thumb = field
                            next
                        bbcode.write(
                            '[URL=%s][img]%s[/img][/URL]' % (field, thumb))

在一条长线上收集所有输出的决定是值得怀疑的。是否可以说服您\nwrite格式字符串中添加final?


推荐阅读