开门见山,我想知道如何使用 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
has.
从技术上讲,这个数字并不重要;这次替换主要是为了确保有一个新的数字,100% 肯定与上一个不同。因此,当我写这个问题时,我意识到我也可以使用系统时间 - 自纪元以来的秒数(AJAX 经常使用该技术来消除后续“相同”请求的缓存)。我最终得到了这个,看起来很完美:
CXREPLACETIME=`date +%s`; find . -type f | xargs sed -i "s/\(\?cache_version\=\)[0-9]\+/\1$CXREPLACETIME/g"
(我首先存储该值,以便所有文件都获得相同的值,以防它出于某种原因跨越多秒)
但我仍然想知道最初的问题,即增加匹配的数字。我猜一个简单的解决方案是使其成为 bash 脚本,但我仍然认为有一种比递归地循环每个文件并检查其内容是否匹配然后替换更简单的方法,因为它只是增加匹配的数字...没有太多其他逻辑。我只是不想写入任何其他文件或类似的东西 - 它应该就地执行,例如sed
与“i”选项一起使用。