Regex 替换指定的字符数
我有这样的想法:Regex 替换指定的字符数,regex,bash,awk,sed,grep,Regex,Bash,Awk,Sed,Grep,我有这样的想法: aaaaaaaaaaaaaaaaaaaaaa 我需要一些东西,使我能够根据指定的数字从左到右用另一个字符(如c)替换a 例如: 某些命令3应将前3个a替换为c cccaaaaaaaaaaaaa 某些命令15 ccccccccccccaaaaaaaa使用awk: s='aaaaaaaaaaaaaaaaaaaaaaaaa' awk -F "\0" -v n=3 -v r='c' '{for (i=1; i<=n; i++) $i=r}1' OFS= <<<
aaaaaaaaaaaaaaaaaaaaaa
我需要一些东西,使我能够根据指定的数字从左到右用另一个字符(如c
)替换a
例如:
某些命令3
应将前3个a
替换为c
cccaaaaaaaaaaaaa
某些命令15
ccccccccccccaaaaaaaa
使用awk:
s='aaaaaaaaaaaaaaaaaaaaaaaaa'
awk -F "\0" -v n=3 -v r='c' '{for (i=1; i<=n; i++) $i=r}1' OFS= <<< "$s"
cccaaaaaaaaaaaaaaaaaaaaaa
s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
awk-F“\0”-vn=3-vr='c'{for(i=1;i使用awk:
s='aaaaaaaaaaaaaaaaaaaaaaaaa'
awk -F "\0" -v n=3 -v r='c' '{for (i=1; i<=n; i++) $i=r}1' OFS= <<< "$s"
cccaaaaaaaaaaaaaaaaaaaaaa
s='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
awk-F“\0”-vn=3-vr='c'{for(i=1;i这完全可以在bash中完成:
some_command() {
a="aaaaaaaaaaaaaaaaaaaaaaaaa"
c="ccccccccccccccccccccccccc"
echo "${c:0:$1}${a:$1}"
}
> some_command 3
cccaaaaaaaaaaaaaaaaaaaaaa
这完全可以在bash中完成:
some_command() {
a="aaaaaaaaaaaaaaaaaaaaaaaaa"
c="ccccccccccccccccccccccccc"
echo "${c:0:$1}${a:$1}"
}
> some_command 3
cccaaaaaaaaaaaaaaaaaaaaaa
基于@anubhava的优秀答案,一个比OP要求的更普遍的解决方案
- 参数化替换计数以及“前后”字符
- “before”字符在任何地方都匹配,而不仅仅是在输入字符串的开头,也不管是否与其他实例相邻
- 输入取自
stdin
,因此可以通过管道输入多行
#用法:
#…|某些_命令_x replaceCount beforeChar after char
某些_命令_x(){
awk-F'\0'-vn=“$1”-vo=“${2:0:1}”-vr=“${3:0:1}”-vofs=”\
'{
while(++in)break;$i=r}
{i=n_matched=0;print}
}'
}
#例如:
一些命令是一个比OP要求的更一般的解决方案,基于@anubhava的优秀答案
- 参数化替换计数以及“前后”字符
- “before”字符在任何地方都匹配,而不仅仅是在输入字符串的开头,也不管是否与其他实例相邻
- 输入取自
stdin
,因此可以通过管道输入多行
#用法:
#…|某些_命令_x replaceCount beforeChar after char
某些_命令_x(){
awk-F'\0'-vn=“$1”-vo=“${2:0:1}”-vr=“${3:0:1}”-vofs=”\
'{
while(++in)break;$i=r}
{i=n_matched=0;print}
}'
}
#例如:
某些命令\u x 2 a c可能适合您(GNU sed):
这将在整个文件中用c
替换前5个a
:
sed -r ':a;/a/{x;/^X{5}$/{z;x;b};s/$/X/;x;s/a/c/;ba} file
对于整个文件中的每一行,这将用c
替换前5个a
,这可能适用于您(GNU-sed):
这将在整个文件中用c
替换前5个a
:
sed -r ':a;/a/{x;/^X{5}$/{z;x;b};s/$/X/;x;s/a/c/;ba} file
这将用c
替换前5个a
,因为整个文件中的每一行Perl有一些可以利用的有趣特性。定义以下bash脚本一些\u命令
:
#! /bin/bash
str="aaaaaaaaaaaaaaaaaaaaaaaaa"
perl -s -nE'print s/(a{$x})/"c" x length $1/er' -- -x=$1 <<<"$str"
Perl有一些可以利用的有趣特性
#! /bin/bash
str="aaaaaaaaaaaaaaaaaaaaaaaaa"
perl -s -nE'print s/(a{$x})/"c" x length $1/er' -- -x=$1 <<<"$str"
为awk使用正则表达式语句为awk+1使用正则表达式语句。您不必硬编码替换字符串:c=${a//?/c}
。此外,在函数中,使用local
,这样您就不会过度污染全局命名空间。+1.您不必硬编码替换字符串:c=${a/?/c}
。此外,在函数中,使用local
,这样就不会过度污染全局命名空间。