Macos 使用sed重新格式化数字在文本文件行中的显示方式
我有一个文本文件,其中有几行,我希望替换格式如下的行:Macos 使用sed重新格式化数字在文本文件行中的显示方式,macos,bash,unix,terminal,Macos,Bash,Unix,Terminal,我有一个文本文件,其中有几行,我希望替换格式如下的行: cat: -0600, dog: +0900 cat: -1000, snake: -0500 cat: -0900 cat: +0100 说 cat: -6, dog: +0900 cat: -10, snake: -0500 cat: -9 cat: +1 还有其他行是: dog: -0700 dog: +1000 那不应该被碰。我已经找过了,不太明白。除非有更好的方法,否则更倾向于使用sed。两个表达式应该可以实现这一点: se
cat: -0600, dog: +0900
cat: -1000, snake: -0500
cat: -0900
cat: +0100
说
cat: -6, dog: +0900
cat: -10, snake: -0500
cat: -9
cat: +1
还有其他行是:
dog: -0700
dog: +1000
那不应该被碰。我已经找过了,不太明白。除非有更好的方法,否则更倾向于使用sed。两个表达式应该可以实现这一点:
sed's | ^cat:-0600 | cat:-6 |;狗:-0700狗:-7文件
我会使用awk,我不知道您是否认为这是一种更好的方法:
awk '/^cat: /{$2/=100}7' file
使用您的输入进行测试:
kent$ echo "cat: -0600
cat: -1000
cat: -0900
cat: +0100
dog: -0700
dog: +1000"|awk '/^cat: /{$2/=100}7'
cat: -6
cat: -10
cat: -9
cat: 1
dog: -0700
dog: +1000
如果您确实想在正数前加上“+
”:
awk '/^cat: /{$2/=100;$2=$2>0?"+"$2:$2}7' file
相同输入:
kent$ echo "cat: -0600
cat: -1000
cat: -0900
cat: +0100
dog: -0700
dog: +1000"|awk '/^cat: /{$2/=100;$2=$2>0?"+"$2:$2}7'
cat: -6
cat: -10
cat: -9
cat: +1
dog: -0700
dog: +1000
给定您的复合数据文件,此脚本提供以下示例输出:
sed 's/^\(cat: [-+]\)0\{0,1\}\([1-9]\{0,1\}[0-9]\)00/\1\2/' data
它查找cat:
后接+
或-
,然后是可选的0(未捕获),然后是可选的[1-9]
后接[0-9]
后接两个0
,并用两个记住的部分替换。它将+0000
转换为+0
。如果最后两位并非总是00
,请修改第一个正则表达式以匹配[0-5][0-9]
或[0-9][0-9]
样本输出:
cat: -6, dog: +0900
cat: -10, snake: -0500
cat: -9
cat: +1
dog: -0700
dog: +1000
不应该触碰的狗线。很近,但如果猫:-0700和其他任何东西在同一条线上,那么它就不起作用了。如果cat:-0700单独在其自己的行上,则它会这样做。请注意,此答案是在样本数据更改为包含
dog
和snake
前两行的cat
条目之后编写的。这不应该成为反对它的理由。