Shell script/regex 替换除了中间关键字的句子(重构 Angular 指令)

Shell script/regex to replace sentences except for a keyword in the middle (refactoring Angular directives)

我需要将所有 Angular 翻译指令替换为来自 ngx 的指令。

简而言之,这意味着改变:

<dt i18n="test label@@testLabel">test</dt>

<dt [translate]="'testLabel'">test</dt>

请注意标签名称周围的额外 '

只需 select i18n=" 并将其更改为 [translate]="' 非常简单regex 但是我的代码将无法编译,因为我的标签将缺少 '.

我继续尝试脚本

SomeText2="<dt i18n=\"testLabel@@testLabel\">Test</dt>"


REGEX_REP= echo $SomeText2 | sed 's/i18n="/\[translate\]="/' | sed 's/@@//'| sed s/\"/\'\"/2

但这只会在每个引号前加上一个撇号。 所以我想我正在寻找一个正则表达式,它可以检查它前面某处是否有某个字符串(例如 [translate]),这样我就可以用 替换 " ]'"".

或者,如果其他人有更好的想法,请告诉我! 谢谢

您可以使用

REGEX_REP="$(echo "$SomeText2" | sed 's/i18n="[^"]*@@\([^"]*\)"/[translate]="'"'"''"'"'"/')"

看到online demo,输出是<dt [translate]="'testLabel'">Test</dt>

i18n="[^"]*@@\([^"]*\)" 模式匹配 i18n=" 子串,然后 [^"]* 匹配除 " 之外的任何 0+ 个字符,@@ 匹配 @@ , \([^"]*\)" 以外的任何零个或多个字符捕获到第 1 组中,并且 " 匹配双引号。

替换为[translate]="''",即[translate]="'<Group 1 value>'"