如何在 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 awk
的 gensub
功能请尝试以下操作。
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 将一个模式替换为另一个模式来保持其值?的主要内容,如果未能解决你的问题,请参考以下文章