Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在unix环境中用另一个模式替换一个模式,并使用sed/awk/tr维护其值?_Unix_Awk_Sed_Tr - Fatal编程技术网

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

如何在unix环境中用另一个模式替换一个模式,并使用sed/awk/tr维护其值?,unix,awk,sed,tr,Unix,Awk,Sed,Tr,我在一个文件(.txt文件)中设置了以下数据集 数据1=275736490;数据11=875511004;数据2=3446704875;数据3=472996840;数据4=0;数据=19708279;数据6=1026218;数据7=0;数据8=428 6;数据9=598611;数据10=15114173;数据11=7483106;数据=15900 25 我想将此数字空格数字模式(例如472996 840)替换为数字,数字模式(472996840)。必须为0 0以及0,0执行此操作。不应更改值。我

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

数据1=275736490;数据11=875511004;数据2=3446704875;数据3=472996840;数据4=0;数据=19708279;数据6=1026218;数据7=0;数据8=428 6;数据9=598611;数据10=15114173;数据11=7483106;数据=15900 25

我想将此数字空格数字模式(例如472996 840)替换为数字,数字模式(472996840)。必须为0 0以及0,0执行此操作。不应更改值。我不能替换所有空格,因为还需要其他空格。我必须将数字之间的空白替换为另一个字符串

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

我试过这个:

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

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

一种简单的方法是捕获空格前的数字和空格后的数字,然后使用第一个和第二个反向引用
\1
\2
重新插入数字。您可以使用正常的替换形式
sed's/find/replace/”
adding
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
的功能感到满意时,可以将其添加到“原地编辑”中。

第一个解决方案:使用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

请在您的问题中添加您的努力(以代码的形式),这是非常值得鼓励的,谢谢您。
sed-E的/([0-9])[([0-9])/\1,2/g'文件
,然后在满足您的意愿时添加
-i
。请参阅学习资源事实上,
tr
完全不适合这样做。我(最后)更新了一个关于此的注释。sed-E的/([0-9])[]([0-9])/\1、\2/g”文件,因此“替换”部分中的\1和\2引用了“查找”部分的匹配子表达式,对吗?正确,每个捕获组
(…)
将捕获括号之间的内容,并
\1
重新插入第一组中的信息,
\2
从第二个开始,依此类推。如果您的
sed
没有可用的扩展正则表达式,您将使用基本正则表达式,例如
sed的/\([0-9]\)[]\([0-9]\)/\1、[2/g]文件
(它看起来更忙,但做的事情完全相同)