我知道如何替换给定字符串的某个子字符串:
foo=abcABC
echo ${foo/abc/xyz} # xyzABC
是否也可以将前 k 个字符替换为 k 次给定字符?
更新:示例:
foobar
,将第一个k = 3
字符替换为Z
yield ZZZbar
。
这在 Perl 中相当简单。我在纯 Unix 实用程序和 BASH 中寻找类似的东西,但可以想到任何东西。我找到的最接近的是tr
.
这是在 Linux 上写的,所以我使用sed -r
. 如果这是在 Mac 上,它应该是sed -E
. 事实上,你甚至可以不使用-E
或-r
标志 i 你在括号前使用反斜杠。
我所做的是用sed
. 第一个找到第一个length
字符并丢弃字符串的其余部分。第二个sed
扔掉第一个length
字符并保留字符串。然后我可以tr
用我的替换字符替换所有字符,然后将两个字符串连接在一起。
string="1234567890"
length="4"
replace="z"
prefix=$(sed -r -e "s/^(.{1,$length}).*/\1/" <<<"$string" | tr "[:alnum:]" "$replace")
postfix=$(sed -r -e "s/^.{1,$length}//" <<<"$string")
string="${prefix}${postfix}"
echo "$string" #Will echo "zzzz567890"
基于Change string char at index X。给定 string $foo
,要通过 string 更改第一个k
字符$pattern
,可以这样做:
for ((i=0; i < $k; i++))
do
foo="${foo:0:$i}$pattern${foo:$((i+1))}"
done
$ a="hellomynameisyou"
$ k=5
$ pattern="x"
$ for ((i=0; i < $k; i++)); do a="${a:0:$i}$pattern${a:$((i+1))}"; echo $a; done
xellomynameisyou
xxllomynameisyou
xxxlomynameisyou
xxxxomynameisyou
xxxxxmynameisyou
$ pattern="Z"
$ k=3
$ a="foobar"
$ for ((i=0; i < $k; i++)); do a="${a:0:$i}$pattern${a:$((i+1))}"; echo $a; done
Zxxbar
ZZxbar
ZZZbar
$ echo $a
ZZZbar
你也可以试试:
matStr=abc
repChar=y
echo "${foo/$matStr/$(seq -s $repChar $((${#matStr}+1)) | tr -d '[0-9]')}"
这在repChar是数字时不适用。
这很容易!
变量:
str='helloworld'
k=3
char='.'
而最重要的部分:
使用 Perl:
echo "$(perl -E "say '$char' x $k")${str:$k}"
使用 Python:
echo "$(python -c "print '$char' * $k")${str:$k}"
使用 printf 和 tr:
echo "$(printf "%${k}s" | tr ' ' "$char")${str:$k}"
纯重击:
for ((i = 0; i < $k; i++)); do echo -n "$char"; done
echo "${str:$k}"
选择你的武器!我会选择纯 bash 解决方案。