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 管道连接到 sed
和 tr
基本上是 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
?
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 管道连接到 sed
和 tr
基本上是 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
?