如何使用sed/awk/tr在Unix环境下将一个模式替换为另一个模式并保留其值?

3

我有一个包含以下数据的文件(.txt文件):

data1 = 275736 490;data11 = 87551 1004; data2 = 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;

我想将这个“数字 空格 数字”模式(例如472996 840)替换为“数字,数字”模式(472996,840)。 这也必须对0 0执行。 值不应更改。 我不能替换所有空格,因为其他空格也是必需的。 我必须将数字之间的空格替换为另一个字符串。

有使用tr/sed/awk的建议吗?

尝试过以下代码:

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

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


请在您的问题中添加您的努力(以代码形式)非常鼓励在SO上,谢谢。 - RavinderSingh13
1
sed -E 's/([0-9])[ ]([0-9])/\1,\2/g' file' 当你确认它达到了你的意图时,可以添加 -i - David C. Rankin
请查看 https://stackoverflow.com/tags/sed/info 以获取学习资源。 - Sundeep
1
实际上,tr 对于这个任务完全不合适。我(终于)更新了 tr 标签信息页面 并在其中注明了这一点。 - tripleee
2个回答

4

一种简单的方法是捕获空格前的数字和其后面的数字,然后使用第一个和第二个反向引用 \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]) /\1,\2/g' file这里的 \1 和 \2 在“替换”部分中是指“查找”部分的匹配子表达式,对吗? - Nizamudheen At
每个捕获组 (...) 将捕获括号内的内容,\1 重新插入第一个组的信息,\2 插入第二个组的信息,以此类推。如果你的 sed 没有扩展正则表达式功能,你可以使用基本正则表达式来转义捕获组,例如 sed 's/\([0-9]\)[ ]\([0-9]\)/\1,\2/g' file(它看起来有些繁琐,但是执行的是同样的操作)。 - David C. Rankin

1

第一种解决方案: 请尝试使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接