23

我正在尝试编写一个正则表达式来用空格替换文件中存在的一个或多个“+”符号。我尝试了以下方法:

 echo This++++this+++is+not++done | awk '{ sub(/\++/, " "); print }'
 This this+++is+not++done

预期的:

This this is not done

任何想法为什么这不起作用?

4

8 回答 8

36

使用gsubwhich 进行全局替换:

echo This++++this+++is+not++done | awk '{gsub(/\++/," ");}1'

sub函数仅替换第一个匹配项,替换所有匹配项使用gsub.

于 2013-01-21T03:43:44.167 回答
15

tr命令:

echo This++++this+++is+not++done | tr -s '+' ' '
于 2013-01-21T03:47:12.687 回答
12

惯用的 awk 解决方案是将输入字段分隔符转换为输出分隔符:

$ echo This++++this+++is+not++done | awk -F'++' '{$1=$1}1'
This this is not done
于 2013-01-21T14:15:57.293 回答
7

试试这个

echo "This++++this+++is+not++done" | sed -re 's/(\+)+/ /g'

于 2013-01-21T05:12:12.850 回答
4

你也可以用sed

echo This++++this+++is+not++done | sed -e 's/+\{1,\}/ /g'

这匹配一个或多个+并将其替换为空格。

于 2013-01-21T03:46:03.267 回答
1

对于这种情况,我推荐sed,这对于替换很强大,并且语法很短。

解决方案sed

echo This++++this+++is+not++done | sed -En 's/\\++/ /gp'

结果:

This this is not done

For awk:您必须使用该gsub函数进行全局行替换(多个替换)。语法: gsub(regexp, replacement [, target]). 如果省略第三个参数,则为$0目标。目标必须是变量或数组元素。gsub 在目标中工作,用替换覆盖目标。

解决方法:

echo This++++this+++is+not++done | awk 'gsub(/\\++/," ")

结果:

This this is not done
于 2022-01-23T22:52:34.133 回答
-2
echo "This++++this+++is+not++done" | sed 's/++*/ /g'
于 2015-03-25T08:40:48.600 回答
-7

如果您可以访问计算机上的节点,则可以通过安装 rexreplace 来实现

npm install -g regreplace

然后运行

rexreplace '\++' ' ' myfile.txt

如果您在目录中有更多文件,data您可以这样做

rexreplace '\++' ' ' data/*.txt
于 2017-03-17T13:09:23.430 回答