如何替换字符串的前k个字符?

时间:2013-08-05 13:53:45

标签: linux bash

我知道如何替换给定字符串的某个子字符串:

foo=abcABC
echo ${foo/abc/xyz}       # xyzABC

是否也可以将前k个字符替换为给定字符的k倍?

更新:示例: foobar,按k = 3生成Z替换前ZZZbar个字符。

4 个答案:

答案 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解决方案。