我试图写一个shell脚本,我在一个XML文件中,使用正则表达式搜索特定的数字,同时通过预定义的变量增加或减少这些数字。脚本应该一次性将这些写入文件。
对于test.xml
文件,我可以使用sed找到数字。但我确信我需要在macOS上使用 awk 来用计算替换这些数字。然而,我不太擅长使用 awk:
sed -E -i "" "s/(textThatPrecedesTheNumbers_)([0-9]+)/\1\2/g" "path to/test.xml"
因此,对于上面的例子,我需要根据变量对正则表达式替换中的每个\2
添加或减去一些内容,然后将所有更改保存到文件中。因此,出现的情况(作为示例):
textThatPrecedesTheNumbers_12
textThatPrecedesTheNumbers_13
textThatPrecedesTheNumbers_14
...与计算变量+4
一起将它们更改为:
textThatPrecedesTheNumbers_16
textThatPrecedesTheNumbers_17
textThatPrecedesTheNumbers_18
我试过这样一个计算:
sed -E -i "" "s/(textThatPrecedesTheNumbers_)([0-9]+)/\1$((\2+4))/ge" "path to/test.xml"
但是这在Mac的sed命令中似乎不起作用,如上所述,我需要加减变量为任何值,如+1
、-3
、-9
或+12
。
任何帮助都将不胜感激。
2条答案
按热度按时间sczxawaw1#
使用任意awk:
如果与您的问题中的示例不同,您的输入实际上包括您不想更改的行,则将
{$NF+=n}
更改为/textThatPrecedesTheNumbers_/{$NF+=n}
或任何其他用于查找要更改的行的标准。关于“脚本应该一次性将这些写入文件”-没有Unix文本处理工具会这样做,它们都创建一个临时文件。在GNU sed,BSD sed,perl,ruby和python中,您使用
-i
来完成此操作,在GNU awk中,您使用-i inplace
,但在所有情况下,您都使用临时文件,因此,而不是任何一个,为了便于移植,您可以使用任何Unix工具tool
执行此操作:所以使用GNU awk你可以:
但是使用MacOS上默认的BSD awk或任何其他awk,您可以轻松地执行等效操作:
l0oc07j22#
如果您使用的是过去17年中任何时候的
OS
版本的mac
,并且文件不是太大,您甚至可以通过以下方式利用复制和粘贴剪贴板1.将整个输出通过管道传输到
pbcopy
,并终止此语句链。1.然后用
pbpaste > file
启动一个***new***命令语句,并跳过整个tmp
-anything中介。我不知道该命令的
Linux
等价物可能是什么。ATOM
-ic