我正在尝试编写一个正则表达式来用空格替换文件中存在的一个或多个“+”符号。我尝试了以下方法:
echo This++++this+++is+not++done | awk '{ sub(/\++/, " "); print }'
This this+++is+not++done
预期的:
This this is not done
任何想法为什么这不起作用?
使用gsub
which 进行全局替换:
echo This++++this+++is+not++done | awk '{gsub(/\++/," ");}1'
sub
函数仅替换第一个匹配项,替换所有匹配项使用gsub
.
或tr
命令:
echo This++++this+++is+not++done | tr -s '+' ' '
惯用的 awk 解决方案是将输入字段分隔符转换为输出分隔符:
$ echo This++++this+++is+not++done | awk -F'++' '{$1=$1}1'
This this is not done
试试这个
echo "This++++this+++is+not++done" | sed -re 's/(\+)+/ /g'
你也可以用sed
。
echo This++++this+++is+not++done | sed -e 's/+\{1,\}/ /g'
这匹配一个或多个+
并将其替换为空格。
对于这种情况,我推荐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
echo "This++++this+++is+not++done" | sed 's/++*/ /g'
如果您可以访问计算机上的节点,则可以通过安装 rexreplace 来实现
npm install -g regreplace
然后运行
rexreplace '\++' ' ' myfile.txt
如果您在目录中有更多文件,data
您可以这样做
rexreplace '\++' ' ' data/*.txt