【问题标题】:Regex to remove occurrences of a word from text, but leave only one space between each word正则表达式从文本中删除出现的单词,但每个单词之间只留一个空格
【发布时间】:2015-04-27 10:06:01
【问题描述】:

这是我经常遇到的一个问题。我有一个包含单词的文本文件,每个单词之间有一个空格,并且在一行的开头或结尾没有空格。我想使用例如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

【问题讨论】:

    标签: regex unix sed


    【解决方案1】:

    你可以用这个awk

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

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


    如果您希望在没有A 的行中保持双倍/三倍间距不变,请使用:

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

    它只会修改带有A的行

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

    【讨论】:

    • 我喜欢这两个答案,但选择这个是因为它要求我只输入一次单词。
    【解决方案2】:

    使用 sed

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

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

    【讨论】:

    • 这将从词尾删除A。这个A BA C ARC B C A 应该变成BA C ARC B C,而不是BC ARC B C
    • 不,它不会...查看 A 之前的空格。(因此只有最后一个单词 A)。
    • 它会将BA C 更改为BC- Op 喜欢删除单词,我猜不是单词的一部分。
    • 是的..我正要提到...编辑了答案..谢谢
    • 现在只有一个问题:如果文件只包含一个单词,应该删除的那个,这个正则表达式不会删除它。
    猜你喜欢
    • 2020-05-09
    • 2013-12-02
    • 2013-11-17
    • 2020-09-03
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多