使用sed和正则表达式进行查找和替换

4
我想使用sed替换资产文件的版本。
我在文件中有这样一个内容:
<script src="<?php echo assetsUrl ?>/ic-1548620973.js"></script>

我想使用这个命令更新时间戳:

sed -i "s/(?<=ic-)(.*)(?=.js)/$timestamp.js/" src/views/partials/foot.view.php

错误信息:
sed: 1: "src/views/partials/foot ...": unterminated substitute in regular expression

你试图替换的原始字符串是什么? - l'L'l
我更新了帖子,请看一下。 - NAG
还有一个问题,$timestamp是什么?那是你想要放在那里的变量值吗? - l'L'l
是的,但如果我输入一个字符串,错误是相同的。 - NAG
3个回答

2

macOS 上的 sed 并不像在 Linux 上的那样工作,因此您需要进行调整。

$ timestamp=$( date +%s )
$ sed -Ei '' 's@(ic-)(.*)(\.js)@\1'"$timestamp"'\3@g' src/views/partials/foot.view.php 

由于您正在使用捕获组,您需要包含 -E 选项,而回顾后视不必要。此外,sed 并不是正确的工具。对于在 macOS 上进行原地编辑,您需要在选项 -i 后面包含两个单引号 '',以便将其保存到原始文件中(原地)。

为了易读性,我将定界符从 / 更改为 @。基本上,您有三个捕获组,只会包含第一个和第三个,并在中间提供 $timestamp 变量。

输出

<script src="<?php echo assetsUrl ?>/ic-1548622266.js"></script>

0

假设您已经安装了ruby

ruby -i -ne 'puts $_.gsub(/(?<=ic-)\d+(?=\.js)/,Time.now.to_i.to_s)' src/views/partials/foot.view.php

我不确定,但似乎ruby已经预装在MacOS中了,对吗?


-1

试试这个:

sed -i 's/(?<=ic-)(.*)(?=.js)/'"$timestamp.js"'/' src/views/partials/foot.view.php

错误信息相同:“正则表达式中未终止的替换” - NAG
sed -i 's/(?<=ic-)(.*)(?=.js)/'"$timestamp.js"'/' src/views/partials/foot.view.php - Omar Ali Ibrahim
尝试使用 \(正斜杠)转义所有括号...由于某种原因,在注释中,我的正斜杠不可见。 - Omar Ali Ibrahim
我尝试了这个命令:sed -i 's/ic-(.*).js/\2019/' src/views/partials/foot.view.php,但是出现了错误提示:“sed: 1: "src/views/partials/foot ...": 在正则表达式中未终止的替换”。 - NAG
1
你��否走一遍你原来的正则表达式及其意图?它到底是在尝试做什么...如果你不介意我问的话(我不是一个正则表达式专家,但我正在努力帮你调试)。 - Omar Ali Ibrahim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接