加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 如何使用sed/awk查找/替换匹配的数字?

发布时间:2020-12-15 19:32:30 所属栏目:安全 来源:网络整理
导读:直到现在,我想知道如何使用grep / find / sed / awk来匹配某个字符串(以数字结尾),并将该数字增加1.我最接近的是将1连接到结束(其工作得很好),因为重点是简单地改变价值。这是我目前正在做的: find . -type f | xargs sed -i 's/(?cache_version=[0-9
直到现在,我想知道如何使用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”,“22222”等等。

我经历了几十篇文章/解释,经常足够的,建议是使用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”选项。

我觉得发现档案对你而言并不困难。因此,我只是去点,做一个计算。如果你有gnu sed,可以这样做:
sed -r 's/(.*)(?cache_version=)([0-9]+)(.*)/echo "12$((3+1))4"/ge' file

举一个例子:

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

kent$  sed -r 's/(.*)(?cache_version=)([0-9]+)(.*)/echo "12$((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 …

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读