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
条目之后编写的。这不应该成为反对它的理由。