正则表达式从文本中删除单词的出现,但在每个单词之间只留一个空格

时间:2015-04-27 10:06:01

标签: regex unix sed

这是我经常遇到的问题。我有一个文本文件,其中包含单词,每个单词之间有一个空格,行的开头或结尾没有空格。我想使用例如sed删除单词的出现,每个单词之间只留一个空格,行的开头或结尾没有空格。这可能是一个正则表达式吗?

我能想到的最佳解决方案需要三个正则表达式。

% cat text
A B C A B C A

% sed -r 's/ ?\bA\b ?/ /g' text
 B C B C 

% sed -r 's/ ?\bA\b ?/ /g' text | sed 's/^ *//' | sed 's/ *$//'
B C B C

2 个答案:

答案 0 :(得分:2)

您可以使用此awk

awk '{gsub(/\<A\>/,"");$1=$1}1' file
B C B C

$1=$1用于清理输出,因此在移除A之后,单词之间只有一个空格。

如果你确实想要在没有A的行中保持完整的双/三间距,请使用:

awk 'gsub(/\<A\>/,""){$1=$1}1' file
B C B C

它只会修改其中A的行

编辑: 更新了单词边界,因此它不会删除部分单词。

答案 1 :(得分:2)

使用 sed

AMD$ sed -r 's/\bA | A$//g' File
B C B C

在这里,我们正在删除带有空格的A。我们将介绍两种可能性(a。A在开头或两者之间,b。A在结尾处。)