文件的正则表达式匹配并重命名+覆盖旧文件

标签 regex linux bash

我正在尝试制作一个 bash 脚本来重命名一些与我的正则表达式匹配的文件,如果它们匹配,我想使用正则表达式重命名它们并覆盖旧的现有文件。

我想这样做是因为在计算机 1 上我有一个文件,在计算机 2 上我更改了该文件。后来我回到计算机 1,它给出了一个示例冲突,因此它保存了它们。

示例文件:

acl_cam.MYI

冲突后的示例文件:

acl_cam (Example conflit with .... on 2015-08-20).MYI

我尝试了很多想法,比如重命名、mv 和一些其他脚本,但没有成功。

我认为我应该使用的正则表达式:

(.*)/s\(.*\)\.(.*)

然后将其重命名为 value1 。 value2 并替换旧文件 (acl_cam.MYI),并对它开始处的所有文件/目录执行此操作

你们能帮我解决这个问题吗?

最佳答案

如果我正确理解你的问题,你遇到的问题分为两部分。 (1) 匹配错误字符串并生成文件名的正确正则表达式是什么?; (2) 如何使用返回的文件名来移动/删除有问题的文件?

如果有问题的刺痛是:

acl_cam (Example conflit with .... on 2015-08-20).MYI

并且您需要返回 MySQL 文件名,然后类似于以下的正则表达式将起作用:

[ ][(].*[)]

流编辑器 sed 与其他编辑器一样好,可以从字符串中返回文件名。示例:

$ printf "acl_cam (Example conflit with .... on 2015-08-20).MYI\n" | \
  sed -e 's/[ ][(].*[)]//'
acl_cam.MYI

(上面显示续行)

然后由您决定如何移动或删除该文件。剩下的问题是信息(错误字符串)当前存储在哪里以及如何访问它?如果您的文件充满了这些错误,那么您可以执行如下操作:

while read -r line; do

    victim=$( printf "%s\n" "$line" | sed -e 's/[ ][(].*[)]//' )

    ## to move the file to /path/to/old
    [ -e "$victim" ] && mv "$victim" /path/to/old

done <$myerrorfilename

(您还可以将字符串作为 here-string 提供给 sed,但为了简单起见省略)

如果适合您的目的,您也可以删除该文件。但是,需要更多信息来阐明该信息的存储方式/位置以及您到底想用它做什么以提供更多细节。如果您还有其他问题,请告诉我。

关于文件的正则表达式匹配并重命名+覆盖旧文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32122486/

相关文章:

regex - node-js中的ipv4/ipv6网络地址匹配

C 程序测试具有可重复输入且无需重新启动的其他程序

unit-testing - Bash:在文件保存时执行脚本?

bash - 从另一个目录获取 bash 文件并返回当前目录的别名

javascript - 使用 vb.net,我可以将此字符串转换为正则表达式吗?

javascript - 我如何将其变成多场比赛?

linux - 符号 errno,版本 GLIBC_2.0 未定义,在 opensuse Linux 11.4 中

linux - 我应该把 util shell 脚本放在 Linux 中的哪里

bash - Bash 中 "while"和 "until"的区别

regex - 匹配后出现 grep