如何使用macOS Shell脚本增加或减少文件中的特定正则表达式编号?

l5tcr1uw  于 2023-03-24  发布在  Shell
关注(0)|答案(2)|浏览(115)

我试图写一个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
任何帮助都将不胜感激。

sczxawaw

sczxawaw1#

使用任意awk:

$ awk -v n=4 'BEGIN{FS=OFS="_"} {$NF+=n} 1' file
textThatPrecedesTheNumbers_16
textThatPrecedesTheNumbers_17
textThatPrecedesTheNumbers_18

如果与您的问题中的示例不同,您的输入实际上包括您不想更改的行,则将{$NF+=n}更改为/textThatPrecedesTheNumbers_/{$NF+=n}或任何其他用于查找要更改的行的标准。
关于“脚本应该一次性将这些写入文件”-没有Unix文本处理工具会这样做,它们都创建一个临时文件。在GNU sed,BSD sed,perl,ruby和python中,您使用-i来完成此操作,在GNU awk中,您使用-i inplace,但在所有情况下,您都使用临时文件,因此,而不是任何一个,为了便于移植,您可以使用任何Unix工具tool执行此操作:

tmp=$(mktemp) && tool file > "$tmp" && mv "$tmp" file

所以使用GNU awk你可以:

awk -i inplace -v n=4 'BEGIN{FS=OFS="_"} {$NF+=n} 1' file

但是使用MacOS上默认的BSD awk或任何其他awk,您可以轻松地执行等效操作:

tmp=$(mktemp) && awk -v n=4 'BEGIN{FS=OFS="_"} {$NF+=n} 1' file > "$tmp" && mv "$tmp" file
l0oc07j2

l0oc07j22#

如果您使用的是过去17年中任何时候的OS版本的mac,并且文件不是太大,您甚至可以通过以下方式利用复制和粘贴剪贴板
1.将整个输出通过管道传输到pbcopy,并终止此语句链。
1.然后用pbpaste > file启动一个***new***命令语句,并跳过整个tmp-anything中介。
我不知道该命令的Linux等价物可能是什么。

  • 小警告:此方法***不被***考虑ATOM-ic

相关问题