用awk替换正则表达式

Aja*_*air 14 regex linux awk

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

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

预期:

This this is not done
Run Code Online (Sandbox Code Playgroud)

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

Gur*_*uru 23

使用gsub哪个进行全局替换:

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

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

  • @DrunkenPoney 末尾的“1”告诉 AWK 在“gsub”开启后打印该行。您可以通过显式地将 print 语句添加到与 `gsub` 相同的操作中来避免这种情况,例如 ```{gsub(/\++/," "); 打印;}``` (6认同)

rad*_*al7 8

tr命令:

echo This++++this+++is+not++done | tr -s '+' ' '
Run Code Online (Sandbox Code Playgroud)


Ed *_*ton 7

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

$ echo This++++this+++is+not++done | awk -F'++' '{$1=$1}1'
This this is not done
Run Code Online (Sandbox Code Playgroud)


ale*_*lex 5

sed你也可以用。

echo This++++this+++is+not++done | sed -e 's/+\{1,\}/ /g'
Run Code Online (Sandbox Code Playgroud)

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


Ran*_*ngh 5

尝试这个

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