【问题标题】:linux shell script string manipulation with regex使用正则表达式处理 linux shell 脚本字符串
【发布时间】:2018-05-22 01:41:44
【问题描述】:

我搜索了很多文档,我认为这是可能的......

我想使用字符串操作从字符串中删除(任何)重复字符,如下所示:

#!/bin/bash
var = "aabbcc112233"
var = $(var//(.)\1/1\/g} # this must be wrong...
echo var = $var

结果必须是:

var = abc123

我发现了很多关于 sed 等的例子......是否可以仅通过字符串操作和正则表达式来解决这个问题?不是其他命令?

最好的问候。

【问题讨论】:

    标签: regex linux shell


    【解决方案1】:

    我们可以在这里使用反向引用:

    echo "aabbcc112233" | sed 's/\(.\)\1*/\1/g'
    
    abc123
    

    这里的技巧是匹配(.),任何字符,后跟可选的相同字符,任意次数,包括零。然后,我们只用一个字母替换。这将有效地删除所有相邻的重复字母。

    【讨论】:

      【解决方案2】:

      由于正则表达式只是字符串匹配的一种模式,它无法在没有工具的情况下操作字符串。不幸的是,shell 没有内置函数来执行此操作,这就是我们需要sedawk 的原因。

      但由于“没有其他命令”,我不认为正则表达式是一个选项。通过“字符串操作”,我想您的意思是外壳扩展。

      我认为有一些方法可以做到这一点,只需使用 bash 内置插件和 shell 扩展。这是一个例子:

      #!/bin/sh
      #
      dup="$1"
      # give $dup's first character to $uni
      uni=${dup:0:1}
      
      while [ "$dup" ]
      do
          # then remove dup's first character
          dup=${dup#?}
          # now if $dup's first NOT equal to $uni's last, append it to $uni
          if [ "${uni: -1:1}" != "${dup:0:1}" ]; then
              uni+=${dup:0:1}
          fi 
      done
      # we have $uni at last
      echo $uni
      

      【讨论】:

      • 我已经推翻了你的反对意见,并要求你为我做同样的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 2018-04-19
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多