【问题标题】:find and replace pattern in file in multiple files在多个文件中查找和替换文件中的模式
【发布时间】:2016-03-20 19:44:04
【问题描述】:

我有 200 个文本文件,结构如下:

n01443537_0.JPEG    0   10  63  58
...
n01443537_499.JPEG  0   3   39  42

在每个文件中,第一部分(在下划线之前,即 n01443537)是不同的。但是,它们都具有相同的结构,即以 n 开头,后跟八位数字。

我希望将所有 200 个文件格式化如下:

n01443537/n01443537_0.JPEG n01443537
...
n01443537/n01443537_499.JPEG n01443537

我发现这个正则表达式 n[^_]* 捕获了所需的模式,但是将它们放在一起有点麻烦。

【问题讨论】:

  • 你对每一行的其余信息做了什么? (例如' 0 10 63 58')?
  • 我只是删除了那些数据

标签: regex bash awk replace


【解决方案1】:

假设您的文件在当前目录中,您可以在命令行中使用sed,如下所示:

sed --in-place 's|\(^n[0-9]*\)\(_[0-9]*\.[a-zA-Z]*\)\(.*\)|\1/\1\2 \1|' *

这个|\1/\1\2 \1|是你的目标,第一个\1匹配第一部分(例如n01443537)然后是/然后是\1然后\2(例如_499.JPEG)然后是空格和终于\1

\[number] 指的是括号之间的每个组|\(^n[0-9]*\)\(_[0-9]*\.[a-zA-Z]*\)\(.*\)|

【讨论】:

    【解决方案2】:

    注意:不精通awkbash

    适合这种情况的正则表达式如下。

    正则表达式: ((n\d{8})_\d+\.JPEG).*

    替换做:\2/\1 \2

    Regex101 Demo

    【讨论】:

    • 谢谢大佬,我刚知道我可以使用嵌套组,所以我的答案中的表达式可以改写为:sed 's|\(\(n[0-9]*\)_[0-9]*\.[a-zA-Z]*\)\(.*\)|\2/\1 \2|' *
    • 注意白色嵌套。组从外到内编号。在( ( ( ) ( ) ) ( ) ) 之类的情况下可能会造成混淆。实验并找出答案;-)
    猜你喜欢
    • 1970-01-01
    • 2013-01-29
    • 2011-07-29
    • 1970-01-01
    • 2013-12-26
    • 2014-01-14
    • 1970-01-01
    • 2012-08-29
    • 2017-08-27
    相关资源
    最近更新 更多