【问题标题】:How to remove consecutive repeating characters from every line?如何从每一行中删除连续的重复字符?
【发布时间】:2020-06-04 05:15:13
【问题描述】:

我在一个文件中有以下几行

Acanthocephala;Palaeacanthocephala;Polymorphida;Polymorphidae;;Profilicollis;Profilicollis_altmani;
Acanthocephala;Eoacanthocephala;Neoechinorhynchida;Neoechinorhynchidae;;;;
Acanthocephala;;;;;;;
Acanthocephala;Palaeacanthocephala;Polymorphida;Polymorphidae;;Polymorphus;;

我想从所有行中删除重复的分号字符,如下所示(注意-上述某些行的中间也有重复的分号)

Acanthocephala;Palaeacanthocephala;Polymorphida;Polymorphidae;Profilicollis;Profilicollis_altmani;
Acanthocephala;Eoacanthocephala;Neoechinorhynchida;Neoechinorhynchidae;
Acanthocephala;
Acanthocephala;Palaeacanthocephala;Polymorphida;Polymorphidae;Polymorphus;

如果有人能分享一个 bash 单行代码来完成此任务,我将不胜感激。

【问题讨论】:

  • 欢迎来到 Stack Overflow。 SO 是面向专业和热情的程序员的问答页面。请在您的问题中添加您自己的代码。您应该至少展示自己为解决这个问题所做的研究。

标签: bash text-processing


【解决方案1】:

您可以将tr 与“挤压”一起使用:

tr -s ';' < infile

【讨论】:

    【解决方案2】:
    perl -p -e 's/;+/;/g' myfile   # writes output to stdout
    

    perl -p -i -e 's/;+/;/g' myfile   # does an in-place edit
    

    【讨论】:

    • sed 解决方案实际上是相同的:sed 's/;\+/;/g' myfile,使用选项-i 就地执行。随时将其添加到您的答案中:)
    • @wjandrea 谢谢。老实说,我并不特别喜欢 sed 在 +\+ 上的行为,因为它与其他应用程序中的正则表达式中的转义方式完全相反(不仅是 perl,还有例如 python 和 egrep),其中反斜杠意味着将+ 视为文字。 (显然,如果需要,您可以将 sed 解决方案添加为单独的答案。)
    • 好的,我发布了我自己的 :)
    【解决方案3】:

    如果你想编辑文件本身:

    printf "%s\n" 'g/;;/s/;\{2,\}/;/g' w | ed -s foo.txt
    

    如果您想将文件的修改副本通过管道传输到其他内容并保持原始文件不变:

    sed 's/;\{2,\}/;/g' foo.txt | whatever
    

    这些将 2 个或更多分号替换为单个分号。

    【讨论】:

      【解决方案4】:

      可以通过替换轻松解决。 我通过使用 FS/OFS 变量添加了一个 awk 解决方案:

      awk -F';+' -v OFS=';' '$1=$1' file
      

      awk -F';+' -v OFS=';' '($1=$1)||1' file
      

      【讨论】:

        【解决方案5】:

        这是alaniwi's answer 的 sed 版本:

        sed 's/;\+/;/g' myfile  # Write output to stdout
        

        sed -i 's/;\+/;/g' myfile  # Edit the file in-place
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-24
          • 1970-01-01
          • 1970-01-01
          • 2018-08-05
          • 1970-01-01
          • 2017-09-20
          • 1970-01-01
          • 2017-04-03
          相关资源
          最近更新 更多