我知道如何替换给定字符串的某个子字符串:
foo=abcABC
echo ${foo/abc/xyz} # xyzABC
是否也可以将前k个字符替换为给定字符的k倍?
更新:示例:
foobar
,按k = 3
生成Z
替换前ZZZbar
个字符。
答案 0 :(得分:0)
基于Change string char at index X。给定字符串$foo
,要通过字符串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
答案 1 :(得分:0)
您也可以尝试:
matStr=abc
repChar=y
echo "${foo/$matStr/$(seq -s $repChar $((${#matStr}+1)) | tr -d '[0-9]')}"
当 repChar 是一个数字时,这不适用。
答案 2 :(得分:0)
这在Perl中相当简单。我在纯Unix实用程序和BASH中寻找类似的东西,但可以想到任何事情。我找到的最接近的是tr
。
这是在Linux上编写的,因此我使用sed -r
。如果这是在Mac上,它应该是sed -E
。事实上,你甚至可以在不使用-E
或-r
标志的情况下离开,而在括号前使用反斜杠。
我所做的是用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"
答案 3 :(得分:0)
这很容易!
变量:
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}"
Pure Bash:
for ((i = 0; i < $k; i++)); do echo -n "$char"; done
echo "${str:$k}"
选择你的武器!我会选择纯粹的bash解决方案。