Regex 如何优化多个sed替换的序列?

Regex 如何优化多个sed替换的序列?,regex,bash,sed,substitution,Regex,Bash,Sed,Substitution,我试图清除一些bash代码中不必要的重复。目前看起来是这样的(示例值): 我一直在考虑将模式和替换放在两个阵列中: pattern[0]='aaa' pattern[1]='bbb' pattern[2]='ccc' # ... replacement[0]='XX' replacement[1]='YY' replacement[2]='ZZ' # ... 但我不知道如何合并最终结果,以便接收并运行如下最终命令: tail $LOGS | sed -e "s/aaa/XX/g" -e "s/

我试图清除一些bash代码中不必要的重复。目前看起来是这样的(示例值):

我一直在考虑将模式和替换放在两个阵列中:

pattern[0]='aaa'
pattern[1]='bbb'
pattern[2]='ccc'
# ...
replacement[0]='XX'
replacement[1]='YY'
replacement[2]='ZZ'
# ...
但我不知道如何合并最终结果,以便接收并运行如下最终命令:

tail $LOGS | sed -e "s/aaa/XX/g" -e "s/bbb/YY/g" -e "s/ccc/ZZ/g"
其思想是能够在以后以清晰易读的方式添加更多的模式和替换,而无需修改执行它们的实际命令


执行此操作的最佳方法是什么?

在循环中创建参数数组:

#!/bin/bash
patterns=( 'a'
           'bcd'
           'x.*z'
)

replacements=( 'A'
               'BCD'
               'Y'
)

args=()
for (( i=0; i < ${#patterns[@]}; i++ )) ; do
    args+=(-e "s/${patterns[i]}/${replacements[i]}/g")
done

echo 'a bcd xyyyz' | sed "${args[@]}"
#/bin/bash
模式=('a'
“bcd”
'x.*z'
)
替换=('A'
“BCD”
“是的”
)
args=()
对于((i=0;i<${#patterns[@]};i++);做
args+=(-e“s/${patterns[i]}/${replacements[i]}/g”)
完成
echo'a bcd xyyyz'| sed“${args[@]}”
顺便说一句:我一开始就用Perl重写了脚本

如果不想将阵列和替换分开,请将两个阵列都使用一个阵列,并增加步骤:

#!/bin/bash
subst=( 'a'    'A'
        'bcd'  'BCD'
        'x.*z' 'Y'
)

args=()
for (( i=0; i < ${#subst[@]}; i+=2 )) ; do
    args+=(-e "s/${subst[i]}/${subst[i+1]}/g")
done

echo 'a bcd xyyyz' | sed "${args[@]}"
#/bin/bash
subst=(“a”“a”
“bcd”“bcd”
'x.*z'Y'
)
args=()
对于((i=0;i<${#subst[@]};i+=2));做
args+=(-e“s/${subst[i]}/${subst[i+1]}/g”)
完成
echo'a bcd xyyyz'| sed“${args[@]}”

在循环中创建参数数组:

#!/bin/bash
patterns=( 'a'
           'bcd'
           'x.*z'
)

replacements=( 'A'
               'BCD'
               'Y'
)

args=()
for (( i=0; i < ${#patterns[@]}; i++ )) ; do
    args+=(-e "s/${patterns[i]}/${replacements[i]}/g")
done

echo 'a bcd xyyyz' | sed "${args[@]}"
#/bin/bash
模式=('a'
“bcd”
'x.*z'
)
替换=('A'
“BCD”
“是的”
)
args=()
对于((i=0;i<${#patterns[@]};i++);做
args+=(-e“s/${patterns[i]}/${replacements[i]}/g”)
完成
echo'a bcd xyyyz'| sed“${args[@]}”
顺便说一句:我一开始就用Perl重写了脚本

如果不想将阵列和替换分开,请将两个阵列都使用一个阵列,并增加步骤:

#!/bin/bash
subst=( 'a'    'A'
        'bcd'  'BCD'
        'x.*z' 'Y'
)

args=()
for (( i=0; i < ${#subst[@]}; i+=2 )) ; do
    args+=(-e "s/${subst[i]}/${subst[i+1]}/g")
done

echo 'a bcd xyyyz' | sed "${args[@]}"
#/bin/bash
subst=(“a”“a”
“bcd”“bcd”
'x.*z'Y'
)
args=()
对于((i=0;i<${#subst[@]};i+=2));做
args+=(-e“s/${subst[i]}/${subst[i+1]}/g”)
完成
echo'a bcd xyyyz'| sed“${args[@]}”

你可以考虑切换到更有效的语言,比如Perl或Python。@ Kenster -一旦我学习其中任何一种语言:你可以考虑切换到一种更有效的语言,比如Perl或Python。@ Kenster -一旦我学习其中任何一个::我试过了,但是它正在输出<代码> ASDFMM1MM2MMM3MM4M < /代码>(所有字母字符均为红色,数字未突出显示)。原因可能是什么?还有没有更简单的方法将元素附加到
模式
替换
?在您的代码中,它们是分开的,当有50个替换时,很难确定哪一个与哪一个匹配。@乔治:回答更新中的第二个问题。仍在检查第一个。@george:你应该用问题中包含的代码将其作为单独的问题发布。该网站告诉我“你只能每90分钟发布一次”。:(我认为你的代码中有错误。如果我尝试
echo“${args[@]}”
它在末尾为每个模式替换对显示了一个附加的
s//
,并且sed表达式没有双引号。如果可能,请更新您的代码,使其正常工作。然后我会再次将其标记为答案。问题:我尝试过,但它正在输出
asdfmm1mmm2mmm3mm4m
(所有字母字符均为红色,数字未突出显示)。原因可能是什么?还有没有更简单的方法将元素附加到
模式
替换
?在您的代码中,它们是分开的,当有50个替换时,很难确定哪一个与哪一个匹配。@乔治:回答更新中的第二个问题。仍在检查第一个。@george:你应该用问题中包含的代码将其作为单独的问题发布。该网站告诉我“你只能每90分钟发布一次”。:(我认为你的代码中有错误。如果我尝试
echo“${args[@]}”
它在末尾为每个模式替换对显示了一个附加的
s//
,并且sed表达式不在双引号中。如果可能,请更新您的代码,使其正常工作。然后我将再次将其标记为答案。