gpt4 book ai didi

bash - 如何使用 sed/awk 查找/替换和增加匹配的数字?

转载 作者:行者123 更新时间:2023-11-29 08:41:36 25 4
gpt4 key购买 nike

开门见山,我想知道如何使用 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”会更好,这样 future 的值就不会是“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”选项所做的那样。

最佳答案

我认为查找文件对您来说不是困难的部分。因此,我直奔主题,进行 +1 计算。如果您有 gnu sed,可以通过以下方式完成:

sed -r 's/(.*)(\?cache_version=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' file

举个例子:

kent$  cat test 
ello
barbaz?cache_version=3fooooo
bye

kent$ sed -r 's/(.*)(\?cache_version=)([0-9]+)(.*)/echo "\1\2$((\3+1))\4"/ge' test
ello
barbaz?cache_version=4fooooo
bye

如果你愿意,你可以添加 -i 选项。

编辑

/e 允许您将匹配的部分传递给外部命令,并用执行结果进行替换。仅限 Gnu sed。

看这个例子:使用了外部命令/工具echo, bc

kent$  echo "result:3*3"|sed -r 's/(result:)(.*)/echo \1$(echo "\2"\|bc)/ge'       

给出输出:

result:9

您可以使用其他强大的外部命令,例如 cut、sed(再次)、awk...

关于bash - 如何使用 sed/awk 查找/替换和增加匹配的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14348432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com