【问题标题】:Using Sed to remove spaces that are NOT between letters使用 Sed 删除不在字母之间的空格
【发布时间】:2018-03-12 07:50:35
【问题描述】:

昨天我发现了 Sed,它太棒了。我可以处理某些简单的正则表达式和文字,但我不确定如何只删除不在两个字母之间的空格(a-zA-Z)。

例如:

输入:

"Mal                        ","","Mr    ","123","  ","   Lauren Hills","Dr  ","  ","      ","        ",

输出:

"Mal","","Mr","123","","Lauren Hills","Dr","","","",

到目前为止,我已经尝试过调整我发现的命令 hereherehere

我得到的最接近的是:

sed 's/ \{1,\}//g' test.csv > test.bak

删除单词之间的重要空格,例如LaurenHills 之间的空格。

【问题讨论】:

    标签: regex sed


    【解决方案1】:
    $ sed 's/ *" */"/g' file
    "Mal","","Mr","123","","Lauren Hills","Dr","","","",
    

    【讨论】:

      【解决方案2】:

      你也可以用这个。

      sed 's/" */"/g;s/ *"/"/g'
      

      【讨论】:

        【解决方案3】:

        在模式中也添加"

        sed -e 's/ \{1,\}"/"/g' -e 's/" \{1,\}/"/g' test.csv > test.bak
        

        解释

        -e 选项用于应用多个sed 操作

        第一部分将 1 个或多个空格字符和 " 替换为单个 "

        第二部分用单个" 替换" 和1 个或多个空格字符

        所以,它会删除引号内的前导和尾随空格。

        【讨论】:

        • 不客气。在这里,我重用了您的模式。您也可以在空格后尝试+ 以匹配一个或多个出现。它更易于阅读。
        • 显然,这是在引号之前/之后使用空格,而不是一般不在字母之间的空格,所以如果这是你想要的,那么你应该编辑你的问题以使其准确,以便其他人在未来有同样的问题可以找到答案,而有您原始问题的人不会误会来到这里。另外,如果这就是你想要的,那么a far simpler solution
        【解决方案4】:

        分三步完成。当左边的字符是字母而右边的字符不是时,一个删除空格,下一步相反,最后一步是当两个都不是字母时删除空格。我们不会删除的唯一组合是两个周围的字符都是字母。

        sed -e 's/\([a-z]\) \{1,\}\([^a-z]\)/\1\2/ig' -e 's/\([^a-z]\) \{1,\}\([a-z]\)/\1\2/ig' -e 's/\([^a-z]\) \{1,\}\([^a-z]\)/\1\2/ig' test.csv > test.bak
        

        【讨论】:

        • 谢谢。这会给出像 "Mal","","Mr","123"," ","Lauren Hills","Dr"," "," "," ", 这样的输出,它是标题中实际问题的答案,但它与所需的输入和输出不匹配。
        • 当两个字符都不是字母时,我添加了一个步骤。
        【解决方案5】:

        在 Perl 中比 sed 更容易:

        perl -pe 's/\B | \B//g' < input > output
        

        \B 代表“不在单词边界”,即它不会删除前后有字母的空格。

        【讨论】:

        • 这更容易。我敢打赌它也更快,因为它是一步到位的。应用到的文件是 400GB。
        • 我的立场是正确的。我有两个实例,一个 sed 和一个 perl 并排运行,而 sed 刚刚飞过 perl 实例以提高速度。 perl 实例在 sed 实例之前大约一分半钟启动,但从文件大小来看,现在 sed 的距离是原来的两倍。
        • @AuntJamaima:sed 更简单可能更快——至少对于更简单的任务而言。
        • wrt 速度:perl 正则表达式 (PCRE) 的评估速度比 BRE 或 ERE 慢(请参阅swtch.com/~rsc/regexp/regexp1.html),当您使用 perl 时,无论您的正则表达式是否为 PCRE,您都会获得 PCRE 正则表达式引擎在评估正则表达式时,您通常应该期望 perl 比 sed 或 awk 慢。
        • 我认为使用perl -pe 's/\B +| +\B//g'sed -E 's/\B +| +\B//g' 会更快...
        猜你喜欢
        • 1970-01-01
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 2020-12-26
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多