Regex 如何优化多个sed替换的序列?
我试图清除一些bash代码中不必要的重复。目前看起来是这样的(示例值): 我一直在考虑将模式和替换放在两个阵列中: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/
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表达式不在双引号中。如果可能,请更新您的代码,使其正常工作。然后我将再次将其标记为答案。