python-3.x - 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 替代品。
grep -R
将递归搜索目标目录中的常规文件。这可以替换为os.walk('tmp')
。请记住,第三个结果只是os.walk
文件名;你必须把每个目录前面的目录粘回去。- 在 Unix 命令行工具中,字段通常从 1 开始编号,而 Python 的索引是从零开始的。所以该行的第二个字段是
line.split(' ')[1]
,不是line.split(' ')[2]
- 如果无法访问您的文件,我不得不猜测
sed
脚本真正接收的输入是什么。我假设每一秒输出都是一个“网页”,而每隔一个输出是一个“缩略图”。
切线地,管道 Awk 到sed
andtr
基本上是无用的;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))
在一条长线上收集所有输出的决定是值得怀疑的。是否可以说服您\n
在write
格式字符串中添加final?
推荐阅读
- python - 如何在多个接收器上仅触发一次 Django 信号
- java - "not in" is working but "not exists" is not working in hql
- javascript - 将已知类型与未知类型进行比较的正确方法是什么?
- reactjs - 如何设置日期字段的最小和最大日期?
- google-apps-script - 将自动创建的 Gmail 标签分配给各个线程 - 谷歌应用脚本
- php - mysql 获取昨天的标志(另一列不是日期时间类型)
- r - 循环一个向量以将其应用于函数以执行网络抓取
- opennlp - 如何使用 NLP 将句子拆分为文本和数字?
- c++ - //usr/lib64/librt.so.1:命令行中缺少 DSO
- d3.js - 使用 d3 v6 获取 x 轴上的刻度,其中 scalesBand 在列下方居中