Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 替换指定的字符数_Regex_Bash_Awk_Sed_Grep - Fatal编程技术网

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
,这样就不会过度污染全局命名空间。