【问题标题】:Recursive multiline find/replace from command line从命令行递归多行查找/替换
【发布时间】:2018-06-25 14:34:12
【问题描述】:

我正在尝试查找和替换 js 文件中的导入语句。我需要考虑几个不同的变体:

// default-import.js
import foo from 'bar-shared';

// named-import.js
import {Foo} from 'bar-shared/foo';

// type-import.js
import type {FooType} from 'bar-shared/foo';

// multiline-import.js
import {
  Foo,
  reduceFoo,
} from 'bar-shared/foo';

// multiline-with-type-import.js
import {
  Foo,
  reduceFoo,
  type FooType,
} from 'bar-shared/foo';

// multiple-import.js
import foo from 'bar-shared';
import {Foo} from 'bar-shared/foo';
import {
  Baz
  reduceBaz
} from 'bar-shared/baz';

我的最终目标是用@bar/core 替换bar-shared。但限制是: - 我不知道具体的进口是什么 - 一个导入语句可以跨越多行 - 在一个文件中可以有多个bar-shared 的导入语句

我已经相当接近以下几点:

find . -type f -name "*.js" -exec \
  perl -0777 -p -i -e "s/^import ([\s\S]*?) from 'bar-shared(.*)'/import \1 from '\@bar\/core\2'/gms" {} +

该脚本似乎并未找到所有实例。具体来说,最后一个示例类型,在文件中有多个 import 语句,似乎是真正的问题。

【问题讨论】:

标签: regex shell perl


【解决方案1】:

您似乎总是需要从import 匹配到第一个from 'bar-shared'。那么

perl -i -0777 -wpe's{import.*?from\s+\x27\Kbar\-shared}{\@bar/core}gs'

\x27 是单引号 (27) 的 hexadecimal escape/s 修饰符使 . 也匹配换行符,这就是您以这种方式处理此多行字符串所需的全部内容。 \K 会丢弃所有以前的匹配项,因此不需要捕获和替换它们。

在您的示例上进行了测试,但我不确定 JS 中的 import 块中可能会出现什么。

【讨论】:

    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2017-03-21
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多