【发布时间】:2013-01-04 03:04:34
【问题描述】:
我正在尝试编写一个正则表达式来用空格替换文件中存在的一个或多个“+”符号。我尝试了以下方法:
echo This++++this+++is+not++done | awk '{ sub(/\++/, " "); print }'
This this+++is+not++done
预期:
This this is not done
任何想法为什么这不起作用?
【问题讨论】:
我正在尝试编写一个正则表达式来用空格替换文件中存在的一个或多个“+”符号。我尝试了以下方法:
echo This++++this+++is+not++done | awk '{ sub(/\++/, " "); print }'
This this+++is+not++done
预期:
This this is not done
任何想法为什么这不起作用?
【问题讨论】:
使用gsub 进行全局替换:
echo This++++this+++is+not++done | awk '{gsub(/\++/," ");}1'
sub 函数只替换第一个匹配,替换所有匹配使用gsub。
【讨论】:
1 是干什么用的?
1 告诉AWK 在gsubed 之后打印出该行。您可以通过将打印语句显式添加到与gsub 相同的操作来避免它,例如{gsub(/\++/," "); print;}
或tr 命令:
echo This++++this+++is+not++done | tr -s '+' ' '
【讨论】:
-s 非常方便。为了简单起见,我会说这是更好的解决方案。
tr 是一个非常被低估的命令。
惯用的 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
对于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
【讨论】: