我需要一些解决方案来替换一些字符串。 我有一个"文件"有了这个内容:
23674,ICMP ping,OK,1,1008-08-25 17:11:02
23686,Ping,OK,1,1008-08-25 16:05:04
23689,SSH Service,OK,1,1008-08-25 16:05:49
23693,系统自由空间,OK,97.9560,2016-08-25 16:06:49
23713,System Free Space,OK,88.0078,2016-09-20 18:02:22
23745,C:\ Free,OK,63.2227,2016-09-21 10:57:03
我使用此代码来获取" Free"像这样的价值:
grep Free file.txt |grep OK | cut -d K -f 2 |cut -d , -f 2 |cut -d . -f 1
然后我得到了这个结果:
97
88个
63个
我需要插入"%"使用此代码进入结果:
grep Free rs.txt |grep OK | cut -d K -f 2 |cut -d , -f 2 |cut -d . -f 1 |sed 's/$/%/g'
结果如下:
97%
88%
63%
我的问题是,如何替换文件上的值,例如" 97.9560"新结果" 97%"等
请给我一个建议。
感谢
答案 0 :(得分:2)
要替换文件中的值:
sed -E -i.bak 's/(Free.*OK,[^.]*)[.][^,]*/\1%/' file.txt
示例:
$ sed -E -i.bak 's/(Free.*OK,[^.]*)[.][^,]*/\1%/' file.txt
$ cat file.txt
23674, ICMP ping, OK, 1, 2016-08-25 17:11:02
23686, Ping, OK, 1, 2016-08-25 16:05:04
23689, SSH Service, OK, 1, 2016-08-25 16:05:49
23693, System Free Space, OK, 97%, 2016-08-25 16:06:49
23713, System Free Space, OK, 88%, 2016-09-20 18:02:22
23745, C:\ Free, OK, 63%, 2016-09-21 10:57:03
-E
这告诉sed使用扩展正则表达式。这减少了我们需要的反斜杠数量。
-i.bak
这表示要就地更改文件,留下备份文件。
s/(Free.*OK,[^.]*)[.][^,]*/\1%/
这告诉sed进行你需要的替换。在这种情况下,sed会查找与正则表达式(Free.*OK,[^.]*)[.][^,]*
匹配的文本。这与Free
后跟OK,
匹配,后跟除句点之外的任何内容,后跟句点,后跟除逗号之外的任何内容。括号将导致从Free
到要在组1中保存的句点之前的最后一个字符的所有内容。
匹配的文字由\1%
替换,这意味着属于第1组的文字\1
,后跟百分号,%
。
答案 1 :(得分:1)
以下是awk
版解决方案:
awk -v OFS=, -F, '/Free.*OK/ {split($4,a,"."); $4=a[1]"%"}1' infile
23674, ICMP ping, OK, 1, 2016-08-25 17:11:02
23686, Ping, OK, 1, 2016-08-25 16:05:04
23689, SSH Service, OK, 1, 2016-08-25 16:05:49
23693, System Free Space, OK, 97%, 2016-08-25 16:06:49
23713, System Free Space, OK, 88%, 2016-09-20 18:02:22
23745, C:\ Free, OK, 63%, 2016-09-21 10:57:03
说明:
此awk
命令仅对包含Free
后跟OK
的行执行操作。由于此文件是csv
文件,请获取第4个字段并拆分为由.
分隔的两个部分。在向其附加%
符号后打印感兴趣的部分。
sed
最适合查找和替换任务,因为它支持就地替换。但是,可以通过awk
使用以下方式实现:
awk -v OFS=, -F, '/Free.*OK/ {split($4,a,"."); $4=a[1]"%"}1' infile > infile.tmp && mv infile.tmp infile
答案 2 :(得分:0)
一对perl
解决方案
$ perl -pe 's/OK,\s*\d+\K\.\d+/%/ if /Free/' ip.txt
23674, ICMP ping, OK, 1, 2016-08-25 17:11:02
23686, Ping, OK, 1, 2016-08-25 16:05:04
23689, SSH Service, OK, 1, 2016-08-25 16:05:49
23693, System Free Space, OK, 97%, 2016-08-25 16:06:49
23713, System Free Space, OK, 88%, 2016-09-20 18:02:22
23745, C:\ Free, OK, 63%, 2016-09-21 10:57:03
OK,\s*\d+\K
正面看后,OK,
后跟零个或多个空格和一个或多个数字\.\d+
点后跟一个或多个数字%
,仅在输入行包含Free
另一种方法是在,
上拆分输入行并更改第4个字段
perl -F, -le '$F[3] =~ s/\.\d+/%/ if /Free/; print join",", @F' ip.txt
如果结果符合预期,可以使用
进行更改 perl -i
没有备份
或
带备份的 perl -i.bkp