bash - grep 特定字符串并用 sed 替换该文件

标签 bash sed grep

我需要一些解决方案来替换一些字符串。 我有一个"file",其内容如下:

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.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

我使用此代码来获取“免费”值,如下所示:

 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%”等替换文件上的值,例如“97.9560”。
请给我一个建议。 谢谢

最佳答案

替换文件中的值:

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/(免费。*好的,[^.]*)[.][^,]*/\1%/

    这告诉 sed 进行您需要的替换。在这种情况下,sed 查找与正则表达式 (Free.*OK,[^.]*)[.][^,]* 匹配的文本。这匹配 Free 后跟 OK, 后跟除句点之外的任何内容,后跟句点,后跟除逗号之外的任何内容。括号会导致从 Free 到句点之前的最后一个字符的所有内容都保存在组 1 中。

    匹配的文本被替换为\1%,这意味着属于组1的文本,\1,后跟百分号,% .

关于bash - grep 特定字符串并用 sed 替换该文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39607425/

相关文章:

linux - sed 命令编辑多个文件(插入,替换行)

sed - <"$fileVariableName"> 在 csh 中做什么?

linux - 从一行中提取多个 float

bash - grep匹配后获取下一个单词

linux - 提取之间的文本

打印 ${IFS@Q} 时出现 Bash 异常

bash - Unix: cat-ing 一个文件本身 - 为什么这会使文件空白?

awk - 仅在第一次出现后在模式匹配后追加一行

linux - 在 Linux 中合并文本文件中的 2 列的 awk 脚本

bash - 来自 shell 变量的 shebang 脚本解释器