正则表达式从文本中删除一个单词的出现,但在每个单词之间只留下一个 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
在结尾)。
这是我经常遇到的问题。我有一个包含单词的文本文件,每个单词之间有一个 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
在结尾)。