0

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

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

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

更新:示例: foobar,将第一个k = 3字符替换为Zyield ZZZbar

4

4 回答 4

0

这在 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"
于 2013-08-05T15:08:58.657 回答
0

基于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
于 2013-08-05T14:12:01.543 回答
0

你也可以试试:

matStr=abc
repChar=y 
echo "${foo/$matStr/$(seq -s $repChar $((${#matStr}+1)) | tr -d '[0-9]')}"

这在repChar是数字时不适用。

于 2013-08-05T14:44:47.653 回答
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}"

纯重击:

for ((i = 0; i < $k; i++)); do echo -n "$char"; done
echo "${str:$k}"

选择你的武器!我会选择纯 bash 解决方案。

于 2013-08-20T01:56:50.290 回答