繁体   English   中英

使用正则表达式的Linux Shell脚本字符串操作

[英]linux shell script string manipulation with regex

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

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

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

结果必须是:

var = abc123

我发现了很多使用sed的示例,等等...仅通过字符串操作和正则表达式可以解决此问题吗? 没有其他命令吗?

最好的祝福。

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

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

abc123

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

由于正则表达式只是字符串匹配的一种模式,因此如果没有工具,它就无法操作字符串。 不幸的是,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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM