我正在尝试在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等...)
答案 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