python 的 grep、awk 和 sed 替代品?

grep, awk and sed alternatives for python?

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

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

有人可以在 python 中为我指明正确的方向吗?

这是一个简单的 Python 替换。

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

切向地,将 Awk 管道连接到 sedtr 基本上是 useless; awk 可以完成这两个工具可以完成的所有事情(尽管一个重要的 sed 脚本可能很难在 awk 中重新实现——但这不是一个例子。1~2 是一个 GNU sed 扩展所以这从一开始就不是很便携,并且在 Awk 中更容易阅读和理解。)。相反,用 Awk 拆分单个 space 有点矫枉过正; 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))

在一条长线上收集所有输出的决定是可疑的;能否说服您在 write 格式字符串中添加最后一个 \n