【问题标题】:How to replace the first k characters of a string?如何替换字符串的前k个字符?
【发布时间】:2013-08-25 10:19:55
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能举一个你正在寻找的输入和输出的例子吗?
  • 当然,示例已添加。

标签: linux bash


【解决方案1】:

基于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

【讨论】:

    【解决方案2】:

    你也可以试试:

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

    这不适用于 repChar 为数字时。

    【讨论】:

      【解决方案3】:

      这在 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"
      

      【讨论】:

        【解决方案4】:

        这很容易!

        变量:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-11-15
          • 2016-05-30
          • 1970-01-01
          • 2012-09-04
          • 2011-09-01
          • 2020-09-14
          • 1970-01-01
          相关资源
          最近更新 更多