如何在 unix 环境中使用 sed/awk/tr 将一个模式替换为另一个模式来保持其值?

Posted

技术标签:

【中文标题】如何在 unix 环境中使用 sed/awk/tr 将一个模式替换为另一个模式来保持其值?【英文标题】:How to substitute a pattern with another pattern in unix enviroment maintianing its values using sed/awk/tr? 【发布时间】:2021-06-27 02:47:22 【问题描述】:

我在一个文件(.txt 文件)中有以下数据集

data1 = 275736 490;data11 = 87551 1004;数据2 = 344670 4875; data3 = 472996 840;data4 = 0 0;data = 19708 279;data6 = 10262 18;data7 = 0 0;data8 = 428 6;data9 = 5986 11;data10 = 15114 173;data11 = 7483 106;data = 15900 25;

我想将这个 digit space digit 模式(例如 472996 840)替换为 digit,digit 模式(472996,840 )。这必须为 0 0 以及 0,0 完成。值不应该改变。我无法替换所有空格,因为还需要其他空格。我必须将数字之间的空格替换为另一个字符串。

使用 tr/sed/awk 有什么建议吗?

试过这个:

sed -i 's/\d+\s\d+/\d+\d+/g' comment3.txt 

另外,在 tr 中看起来我们无法匹配模式

【问题讨论】:

请在您的问题中添加您的努力(以代码的形式),这是非常鼓励的,谢谢。 sed -E 's/([0-9])[ ]([0-9])/\1,\2/g' file 然后添加 -i 满意后它会按照您的意愿行事。 学习资源见***.com/tags/sed/info 确实,tr 完全不适合这个。我(最终)更新了the tr tag info page,并对此进行了说明。 【参考方案1】:

一种简单的方法是捕获空格前面的数字和后面的数字,然后使用第一个和第二个反向引用\1\2 在其之间用逗号重新插入数字。您将使用sed 's/find/replace/' 的正常替换形式添加g 以使替换成为全局(全部替换)。例如:

sed -E 's/([0-9])[ ]([0-9])/\1,\2/g' file

这将获取您的数据,例如

data1 = 275736 490;data11 = 87551 1004; data2 = 344670 4875; data3 = 472996 840;...

并将该行转换为:

data1 = 275736,490;data11 = 87551,1004; data2 = 344670,4875; data3 = 472996,840;...

当您对它符合您的预期感到满意时,您可以将-i 添加到“就地编辑”。

【讨论】:

sed -E 's/([0-9])[ ]([0-9])/\1,\2/g' 文件 所以这里的 \1 和 \2 在 'replace ' 部分是指匹配 'find' 部分的子表达式对吗? 正确,每个捕获组(...) 将捕获括号之间的内容,\1 重新插入第一组的信息,\2 第二组的信息,依此类推。如果您没有可用于 sed 的扩展正则表达式,您将使用基本正则表达式转义捕获组,例如sed 's/\([0-9]\)[ ]\([0-9]\)/\1,\2/g' file(看起来更忙,但做的事情完全一样)【参考方案2】:

第一种解决方案:使用 GNU awkgensub 功能请尝试以下操作。

awk '

  print gensub(/([0-9]+) +([0-9]+)/, "\\1,\\2", "g", $0)

' Input_file


第二个解决方案: 使用 GNU awk,您也可以尝试跟随。

awk -v RS='[0-9]+[[:space:]]+[0-9]+' 'sub(/[[:space:]]+/,",",RT);ORS=RT 1' Input_file

【讨论】:

以上是关于如何在 unix 环境中使用 sed/awk/tr 将一个模式替换为另一个模式来保持其值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在UNIX环境中运行MySQL多实例?!

如何在 unix 环境中填充超过 1024 个字符的文件?

如何在unix环境下实现共享内存

Unix环境编程:fork()简述

Unix环境高级编程进程环境

Unix环境高级编程线程控制