如何在使用 sed/awk/tr 维护其值的 unix 环境中用另一个模式替换一个模式?

How to substitute a pattern with another pattern in unix enviroment maintianing its values using sed/awk/tr?

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

数据 1 = 275736 490;数据 11 = 87551 1004;数据 2 = 344670 4875;数据 3 = 472996 840;数据 4 = 0 0;数据 = 19708 279;数据 6 = 10262 18;数据 7 = 0 0;数据 8 = 428 6;数据 9 = 5986 11;数据 10 = 15114 173;数据 11 = 7483 106;数据 = 15900 25;

我想将此 digit space digit 模式(例如 472996 840)替换为 digit ,digit 模式 (472996,840)。对于 0 0 以及 0,0 都必须这样做。不应更改值。我无法替换所有白色 space,因为还需要其他白色 space。我必须将数字之间的白色 space 替换为另一个字符串。

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

试过这个:

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

此外,在 tr 中我们似乎无法匹配模式

一个简单的方法是捕获 space 之前的数字和它后面的数字,然后使用第一个和第二个反向引用 </code> 和 <code>。您可以使用 sed 's/find/replace/' 添加 g 的正常替换形式来进行全局替换(全部替换)。例如:

sed -E 's/([0-9])[ ]([0-9])/,/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 添加到“就地编辑”,如果您对它的功能符合您的预期感到满意。

第一个解决方案: 使用 GNU awkgensub 函数,请尝试以下操作。

awk '
{
  print gensub(/([0-9]+) +([0-9]+)/, "\1,\2", "g", [=10=])
}
' Input_file


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

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