Regex 使用正则表达式进行linux shell脚本字符串操作
我搜索了很多文档,我认为这是可能的 我想使用字符串操作从字符串中删除(任何)重复字符,如下所示:Regex 使用正则表达式进行linux shell脚本字符串操作,regex,linux,shell,Regex,Linux,Shell,我搜索了很多文档,我认为这是可能的 我想使用字符串操作从字符串中删除(任何)重复字符,如下所示: #!/bin/bash var = "aabbcc112233" var = $(var//(.)\1/1\/g} # this must be wrong... echo var = $var 结果必须是: var = abc123 我发现了很多sed的例子,等等。。。是否可以仅使用字符串操作和正则表达式来解决此问题?不是别人指挥吗 致以最诚挚的问候。我们可以在此处使用背景参考: echo "
#!/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
但由于“没有其他命令”,我不认为regex是一个选项。我想“字符串操作”是指shell扩展
我认为有一些方法可以做到这一点,只要使用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
我已经推翻了你的否决票,请你也为我这样做。