我有一个包含多行的文本文件,我正在寻找替换格式如下的行:
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|; s|^dog: -0700|dog: -7|;' file
我会用 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:
后跟一个+
or -
,然后是一个可选的 0 (未捕获),然后是一个可选的[1-9]
后跟[0-9]
两个0
',并将其替换为两个记住的部分。它将转换+0000
为+0
. 如果最后两位数字不总是00
,请修改第一个正则表达式以匹配[0-5][0-9]
or [0-9][0-9]
。
样本输出:
cat: -6, dog: +0900
cat: -10, snake: -0500
cat: -9
cat: +1
dog: -0700
dog: +1000