【问题标题】:unix - find and replace with regexunix - 用正则表达式查找和替换
【发布时间】:2014-11-11 23:40:07
【问题描述】:

我想查找所有包含字符串“Of”的文件,用“of”替换,除了在“Of”之前带有连字符的字符串:“- Of”。

首先我有这个命令:

find . -depth -name "* Of *" -exec bash -c 'for f; do base=${f##*/}; mv -- "$f" "${f%/*}/${base// Of / of }"; done' _ {} +

但我想使用正则表达式来排除“-Of”。

我该怎么做?

我对 sed 正则表达式感到困惑。

使用

find . -regextype sed -regex '.* Of *'

它只找到以 Of 结尾的路径。

帕特里克

【问题讨论】:

  • 拜托,有人对此有简单的解决方案吗?

标签: regex unix replace find


【解决方案1】:

尝试使用rename 执行此操作:

$ find . -depth -name "* Of *" -exec rename -n 's|(?<!-)\s+Of|of|' {} +

来自shell 提示。它非常有用,您可以像我一样将一些 代码替换。

当您的测试有效时,您可以移除-n(试运行模式开关)。

我使用negative look behind高级正则表达式

还有其他同名的工具可能会也可能不会这样做,所以要小心。

如果您运行以下命令 (linux)

$ file $(readlink -f $(type -p rename))

你会得到类似

的结果
.../rename: Perl script, ASCII text executable

那么这似乎是正确的工具 =)

如果不是,则将其设为 Debian 和类似 Ubuntu 的衍生工具的默认值(通常已经如此):

$ sudo update-alternatives --set rename /path/to/rename

(将/path/to/rename 替换为您的perl's rename 命令的路径。


如果你没有这个命令,搜索你的包管理器安装它或do it manually


最后但同样重要的是,这个工具最初是由 Perl 的父亲 Larry Wall 编写的。

【讨论】:

  • 抱歉,我到底应该把 rename -n 's|(?
  • 在包含 Of 个文件的目录所在的 shell 中
  • 再次抱歉,你完全失去了我。感谢您的尝试。
  • 它不工作。我明白了:重命名:未知选项--n。如果我删除 -n :重命名:没有足够的参数
  • 所以你没有正确的重命名命令,请参阅我原来的帖子中的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2011-06-16
  • 1970-01-01
  • 2017-01-28
  • 2015-01-11
  • 2012-12-02
相关资源
最近更新 更多