[英]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没有内置的功能可以执行此操作,因此我们需要sed
和awk
。
但是由于没有其他命令,我不认为正则表达式是一种选择。 通过“字符串操作”,我想您的意思是外壳扩展。
我认为有一些方法可以仅使用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.