使用sed查找并除以文件中的所有数字

时间:2019-06-14 09:17:06

标签: macos sed

我正在尝试在json文件中查找所有数字,并在Mac上使用sed将其替换为原始数字的一半。例如,在这里我搜索2010并将其替换为1005:

file="data.json"
sed -i '' -E 's,([^0-9]|^)2010([^0-9]|$),\1 1005\2,g' "$file"

我想找到所有数字实例,并将其替换为其自身的一半值。它需要使用小数,例如:2009年将变为1004.5,10.5将变为5.25。

我知道这可能会占用每个单独的数字字符,因此也许需要查找两侧带有非数字字符的数字。

edit:我希望它具有灵活性,并且可以处理所有形式的文本文件,而不仅仅是JSON文件。 (.txt,.html,.rtf等...)

2 个答案:

答案 0 :(得分:3)

您可以将Perl与带有e修饰符的正则表达式一起使用:

perl -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/2}ge' file

要内联修改文件,请添加-i选项:

perl -i -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/2}ge' file
perl -pi.bak -e 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/2}ge' file # To save a backup of the original file

请参见online demo

s="abc_2010_and+2009+or-10.5"
perl -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/2}ge' <<< "$s"
# => abc_1005_and+1004.5+or-5.25

(?<!\d)(\d+(?:\.\d+)?)(?!\d)正则表达式匹配

  • (?<!\d)-不允许在左边立即输入数字
  • (\d+(?:\.\d+)?)-第1组($1):1位以上的数字,后跟.和1位以上的可选数字
  • (?!\d)-不允许在右边立即输入数字。

RHS-$1/2-是将第1组值除以2的表达式。这是通过在正则表达式的末尾添加e修饰符来实现的。

答案 1 :(得分:0)

使用GNU awk进行多字符RS和RT只是:

awk -v RS='[0-9]+([.][0-9]+)?' -v ORS= 'RT{$0=$0 RT/2} 1'

例如,借用@Wiktors示例:

$ s="abc_2010_and+2009+or-10.5"
$ awk -v RS='[0-9]+([.][0-9]+)?' -v ORS= 'RT{$0=$0 RT/2} 1' <<< "$s"
abc_1005_and+1004.5+or-5.25

如果要覆盖输入文件,请添加-i inplace

awk -i inplace -v RS...1' file