【问题标题】:Perform a regex operation over files in directory对目录中的文件执行正则表达式操作
【发布时间】:2011-07-14 18:15:42
【问题描述】:

我想用<i> </i> 替换<span class='i'> </span> 的实例,因为我决定用这种方式来格式化我的页面。所以我想出了这个命令:

perl -pe "s/<span +class *= *['\"]i['\"] *>(.*?)<\/span>/<i>\1<\/i>/g"

我可以让它更详细,但我真的不认为有像&lt; / span&gt; 这样的奇怪标签的实例,所以我会留下它。它确实有一个非贪婪的捕获,这就是我使用perl -p 而不是sed 的原因。

所以这将输出正确修改的行,但我不确定通过此命令发送多个文件的最佳方式。如果我希望所有pages/*.html 都修复span class='i' 标签,最好的方法是什么?除了 for 循环之外,bash 是否提供了一些用于执行此操作的规定?

【问题讨论】:

  • 那么问题是什么?

标签: regex perl bash unix scripting


【解决方案1】:

@Steven,根据您对@SiegeX 的回答的评论,以下将正常工作:

perl -pi -e "s/<span +class *= *['\"]i['\"] *>(.*?)<\/span>/<i>\1<\/i>/g" *.html

我会让 Perl 创建文件的备份,所以将第一部分更改为

perl -pi.bak -e ...

【讨论】:

  • 我评论了你对另一个答案的评论,因为我先读了那个:)
【解决方案2】:

以下内容将遍历 pages/ 中的所有 html 文件,并使用您的 perl 脚本进行就地编辑。

#!/bin/bash

for file in pages/*.html; do
  perl -pi -e "s/<span +class *= *['\"]i['\"] *>(.*?)<\/span>/<i>\1<\/i>/g" "$file"
done

【讨论】:

  • 您似乎已经通过发布更长的方式回答了我的问题。这不行吗? perl -pi -e "s/&lt;span +class *= *['\"]i['\"] *&gt;(.*?)&lt;\/span&gt;/&lt;i&gt;\1&lt;\/i&gt;/g" *.html 当然,在 cd pages/ 之后运行它
  • @Steven 公平地说,我不经常使用perl,所以没有尝试我不确定是否就地选项可以接受多个输入文件,它很可能。
  • 你能稍微修改一下你的答案吗?我想我可能不小心给你投了反对票,在你编辑之前我不会收回它。
  • @Steven, perl -pi -e "s/&lt;span +class *= *['\"]i['\"] *&gt;(.*?)&lt;\/span&gt;/&lt;i&gt;\1&lt;\/i&gt;/g" *.html 确实可以正常工作。不过,我会让 Perl 创建文件的备份,如 perl -pi.bak -e ...
  • @Mauritz 实际上真的很酷。然后我可以做一个差异来检查变化。 perl 不是很棒吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
相关资源
最近更新 更多