替换指定字符数



我有这样的东西:

aaaaaaaaaaaaaaaaaaaaaaaaa

我需要一些东西,允许我根据指定的数字将a替换为另一个字符,例如从左到右c

例如:

some_command 3应将前 3a替换为c
cccaaaaaaaaaaaaaaaaaaaaaa


some_command 15cccccccccccccccccaaaaaaaaaa

这完全可以在 bash 中完成:

some_command() {
a="aaaaaaaaaaaaaaaaaaaaaaaaa"
c="ccccccccccccccccccccccccc"
echo "${c:0:$1}${a:$1}"
}
> some_command 3
cccaaaaaaaaaaaaaaaaaaaaaa

使用 awk:

s='aaaaaaaaaaaaaaaaaaaaaaaaa'
awk -F "" -v n=3 -v r='c' '{for (i=1; i<=n; i++) $i=r}1' OFS= <<< "$s"
cccaaaaaaaaaaaaaaaaaaaaaa

这可能对你有用(GNU sed):

sed -r ':a;/a/{x;/^X{5}$/{x;b};s/$/X/;x;s/a/c/;ba} file

这将在整个file中将前 5 个a替换为c

sed -r ':a;/a/{x;/^X{5}$/{z;x;b};s/$/X/;x;s/a/c/;ba} file

这将用整个file中每行的c替换前 5 个a

#/bin/bash
char=c
word=aaaaaaaaaaaaaaaaaaaaaaaaa
# pass in the number of chars to replace
replaceChar () {
num=$1
newword=""
# this for loop to concatenate the chars could probably be optimized
for i in $(seq 1 $num); do newword="${newword}${char}"; done
word="${newword}${word:$num}"
echo $word
}
replaceChar 4

一个比OP要求的更通用的解决方案,建立在@anubhava的出色答案之上。

  • 参数化替换计数以及"之前和之后"字符。
  • "before"字符在任何地方匹配 - 不仅仅是在输入字符串的开头,也无论是否与其他实例相邻。
  • 输入取自stdin,因此可以管道输入多条线路。
# Usage:
# ... | some_command_x replaceCount beforeChar afterChar
some_command_x() { 
awk -F '' -v n="$1" -v o="${2:0:1}" -v r="${3:0:1}" -v OFS='' 
'{
while(++i <= NF)
{ if ($i==o) { if (++n_matched > n) break; $i=r } }
{ i=n_matched=0; print }
}'
}
# Example:
some_command_x 2 a c <<<$'abc_abc_abcnaaa rating'
# Returns:
cbc_cbc_abc
cca rating

Perl 有一些有趣的特性可以被利用。定义以下 bash 脚本some_command

#! /bin/bash
str="aaaaaaaaaaaaaaaaaaaaaaaaa"
perl -s -nE'print s/(a{$x})/"c" x length $1/er' -- -x=$1 <<<"$str"

测试:

$ some_command 5
cccccaaaaaaaaaaaaaaaaaaaa

相关内容

  • 没有找到相关文章

最新更新