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

2023-12-30

开门见山,我想知道如何使用 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”选项一起使用。


我认为查找文件对您来说并不是困难的部分。因此我直接进入正题,进行+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 选项。

edit

/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...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 sed/awk 查找/替换和增加匹配的数字? 的相关文章

  • 将 mysql 查询输出存储到 shell 变量中

    我需要一个变量来保存从数据库检索的结果 到目前为止 这基本上是我正在尝试但没有成功的事情 myvariable mysql database u user p password SELECT A B C FROM table a 正如你所看
  • 仅替换引号之间的空格

    我有日志文件中的一行 field 1234 text in quotes 1234 other text in quotes 我想替换引号之间的空格 这样我就可以使用空格作为分隔符来提取列 所以结果可能是这样的 field 1234 tex
  • Python子进程Exec格式错误

    抱歉 如果这个问题很愚蠢 我正在使用Pythonsubprocess在 Ubuntu Natty 11 04 中调用 bat 文件的语句 但是 我收到错误消息 Traceback most recent call last File pfa
  • Bash 和双引号传递给 argv

    我重新设计了这个示例以使其简单 但我想做的是在 bash shell 执行它时获取一个嵌套双引号字符串作为单个 argv 值 这是脚本示例 set x command1 key1 value1 key2 value2 key3 value3
  • 在后台使用 HERE_DOC 方法运行脚本

    我有一个应该在后台运行的脚本 我必须在运行 bash 后立即回答一个问题 我该怎么做 nohup python script py lst lt
  • 忽略 sed 查找和替换命令中的斜杠

    我正在尝试在终端中使用 sed 进行查找和替换 在 apache 配置文件中 我尝试替换 DocumentRoot var www with DocumentRoot var www mysite com public html 从命令行
  • 不要将变量内容视为 sed 中的特殊字符

    我有以下内容sed命令 sed i 4i CHANGES CHANGELOG rst 然而 我的 CHANGES变量看起来像这样 title list elem elem 因此 上述命令失败并出现以下错误 sed e expression
  • Virtualenv 激活脚本不会在带有 set -euo 的 bash 脚本中运行

    我正在尝试创建一个激活 virtualenv 的 bash 脚本 pip 安装 requests txt 并继续 这将是我的 init sh 脚本 供以后使用 usr bin env bash set euo pipefail DIR sc
  • 使用grep 读取文件中pattern1 的日志并仅打印包含pattern1 的行。当在文件中找到pattern2时停止搜索

    Using grep sed awk我想寻找pattern1 until pattern2在文件中找到并打印仅包含的结果pattern1 我不想要模式 1 和模式 2 范围之间的线 该站点中有许多解决方案 请帮忙 我尝试了以下方法但没有结果
  • 使用 awk 如何组合两个文件中的数据并将第二个文件中的值替换到第一个文件中?

    有什么想法如何使用 awk 进行以下操作吗 两个输入文件 data txt和keys txt data txt 包含一些数据 A 1 B 2 A 3 keys txt 包含 键 值 对 本例中的 C 不是 data txt 的一部分 但 a
  • 使用 sed 将每行多个字段拆分为单独的行,保留行前缀

    上周五我遇到了一个问题 要将文本转换为另一种格式 在那台机器上 只有 gnu sed 可用 没有 awk 奇怪 我知道 而且我对 perl 一无所知 所以我正在寻找一个仅限 sed 的解决方案 文件内容是 a yao com sina co
  • 独特的 Linux 文件名,可按时间排序

    以前我用的是uuidgen http man7 org linux man pages man1 uuidgen 1 html创建唯一的文件名 然后我需要通过 bash 脚本按日期 时间迭代该文件名 从那时起 我发现简单地通过 ls l 循
  • 将 bash 提示符下的当前命令复制到剪贴板

    我想要一个快速的键盘命令序列 将 bash 提示符处的当前命令复制到剪贴板 例如 要将最后一个 bash 命令复制到剪贴板 我会按 up some command sequence 复制它 或者 例如 要在 bash 历史记录中搜索命令 我
  • Bash 脚本跳过提取受密码保护的档案

    我有一个脚本 它使用命令对某些文件夹中的特定 zip 和 或 tar gz 存档进行批量提取 unzip o zip path d destination folder 不幸的是 当存档受密码保护时 脚本会停止并等待密码输入 有没有办法省略
  • Grep 搜索带有换行符的字符串

    如何使用 grep 输出下面给出的输入文件中出现的字符串 export to excel 具体来说 如何处理搜索字符串之间发生的换行符 grep 中是否有一个开关可以执行此操作或其他命令 输入文件 文件a txt 等等 导出到优秀 巴拉巴拉
  • 命令中的 Bash 变量扩展[重复]

    这个问题在这里已经有答案了 DATE 1 week ago date date DATE 不起作用 我怎样才能让它发挥作用 我可以做 DATE CMD date date DATE eval DATE CMD 但我不想将整个命令存储在变量中
  • 通过 Node.js 运行 bash 脚本 - 非法选项 -o pipelinefail

    我正在尝试使用 Node js 执行 bash 脚本child process exec 然而它在文件的第二行爆炸 usr bin env bash set eo pipefail TRACE set x echo we are here
  • 从文件中随机采样行

    我有一个大约 40gb 和 1800000 行的 csv 文件 我想随机采样 10 000 行并将它们打印到一个新文件中 现在 我的方法是将 sed 用作 sed n vars lt input txt gt output txt Wher
  • 水银大号

    你知道如何让 Quicksilver 在屏幕上显示大量的大字体吗 通过点击 然后输入自由文本 选择 操作 下的 查看大字体 并按 Enter 键 好吧 有谁知道一种以编程方式做到这一点的方法吗 另外 quicksilver 是必需的还是内置
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译

随机推荐