直截了当地说,我想知道如何使用grep/find/sed/awk来匹配以数字结尾的特定字符串并将该数字增加1。目前我最接近的方法是在末尾连接一个1(这已经足够好用),因为主要目的只是改变这个值。以下是我目前正在做的事情:
find . -type f | xargs sed -i 's/\(\?cache_version\=[0-9]\+\)/\11/g'
因为我无法找出如何使数字递增,所以我将整个内容捕获,然后只是追加了一个“1”。 之前我的代码像这样:
find . -type f | xargs sed -i 's/\?cache_version\=\([0-9]\+\)/?cache_version=\11/g'
所以至少我了解如何获取我所需的内容。
不是解释这是什么,而是解释我想要它执行的操作。它应该基于当前目录(不重要,可以是任何目录,所以稍后我会进行配置),递归地在任何文件中查找与数字 "?cache_version=" 匹配的文本,然后增加该数字并替换文件中的原数字。
目前我拥有的东西可以正常工作,只是无法在找到的数字末尾递增它。最好能够增加而不是附加 "1",这样未来的值就不会为 "11"、"111"、"1111"、"11111" 等。
我已经阅读了数十篇文章/解释,经常建议使用 awk
,但我却不能将它们混合使用。我接近使用 awk
的方法是下面这个,它实际上不会替换任何内容:
grep -Pro '(?<=\?cache_version=)[0-9]+' . | awk -F: '{ print "match is", $2+1 }'
我想知道是否有一种方法可以在结尾处使用sed
并传递原文件名称,以便sed
可以获取文件名和增加的数字(来自awk
),或者它所需要的任何内容,与xargs
类似。
从技术上讲,这个数字并不重要;这个替换的主要目的是确保那里有一个新的数字,100%肯定不同于上一个。所以当我写这个问题时,我意识到我可能也可以使用系统时间-自纪元以来的秒数(AJAX经常使用的技术),以消除后续“相同”的请求的缓存。我最终得到了以下代码,看起来很完美:
CXREPLACETIME=`date +%s`; find . -type f | xargs sed -i "s/\(\?cache_version\=\)[0-9]\+/\1$CXREPLACETIME/g"
(我先存储这个值,以便所有文件得到相同的值,以防它由于某种原因跨越了多个秒)
但我仍然希望知道原始问题,即如何递增匹配的数字。我猜想一个简单的解决方案是将其变成Bash脚本,但是我认为还有一种比逐个递归文件并检查其内容是否匹配再替换更简单的方式,因为它只是递增匹配的数字...没有太多其他的逻辑。 我只是不想写入任何其他文件或类似的东西-它应该就地完成,就像sed
使用"i"选项一样。
echo
和/e
标志。您能再详细解释一下吗? - Ian<script type="text/javascript" src="asdf.js?cache_version=2"></script>
,那么我会收到关于“未预期的标记“<”附近的语法错误”的错误。然后,它还会剥离"
字符(可能更多)。上面有两个注释,其中包含我的当前命令。这有意义吗? - Ian...|sed 's/"/\\"/g'|sed -r 's/(.*)(\?cache_version=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge'
。 - Kentsed(GNU sed)4.4
,但我不知道为什么会有问题。使用-i
将数字更改为24而不是4。没有-i
,我不确定它会做什么,因为输出很奇怪,只显示最后一行。也许这可以归咎于我的终端。但在Linux服务器(GNU sed版本4.2.1
)上,它按预期工作。第二个例子在两个系统上都有效。 - piojo