直截了当,我想知道如何使用 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
,但我不能终生将它们混合在一起。我最接近 usingawk
的,它实际上并没有取代任何东西,是:
grep -Pro '(?<=\?cache_version=)[0-9]+' . | awk -F: '{ print "match is", $2+1 }'
我想知道是否有某种方法可以sed
在末尾传递 a 并传递原始文件名,以便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”选项一样。