[英]Find and divide all numbers in a file using 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。
我知道这可能会占用每个单独的数字字符,因此也许需要查找两侧带有非数字字符的数字。
编辑:我希望它具有灵活性,并且可以处理所有形式的文本文件,而不仅仅是JSON文件。 (.txt,.html,.rtf等...)
您可以将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
参见在线演示 :
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
修饰符来实现的。
使用用于多字符RS和RT的GNU awk,它就是:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.