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

Regex to remove occurrences of a word from text, but leave only one space between each word

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

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

% 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

你可以使用这个awk

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

= 用于清理输出,因此在删除 A 后,单词之间只有一个 space。


如果您希望 double/triple 间距在没有 A 的行中保持完整,请使用:

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

只会修改包含A的行

编辑: 更新了词边界,所以它不会删除部分词。

sed:

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

在这里,我们用 space 删除 A。我们涵盖了 2 种可能性(a. A 在开头或中间的任何地方,b. A 在结尾)。