现在,我有搜索和替换单词的脚本。我如何为句子或单词组合做同样的事情。 看看我的剧本:
first_words="wwe wwf ziggler"
second_words="tna njpw okada"
mywords=( $first_words )
mywords2=( $second_words )
if [ ${#mywords[@]} != ${#mywords2[@]} ];then
echo "you should use the same count of words"
exit 1
else
echo "you are using the same count of words, continue ..."
fi
for ((i=0;i<"${#mywords[@]}";++i)); do
sed -i "s/${mywords[$i]}/${mywords2[$i]}/g" text.txt
done
它有效,但只能逐字替换。但是,如果我想在几个wordcombinations上替换几个wordcombinations。 例如“dolph ziggler,john cena,randy orton”我想替换“cm punk,hulk hogan,rey mysterio”。我应该在这个场所做些什么。可能是我应该处理一些分隔符。在第一种情况下,空格是单词的分隔符,但在这种情况下,我不能使用空格。我可以做什么 ?请帮忙。
答案 0 :(得分:1)
mysentences=( "first sentence" "second sentence" )
mysentences2=( "new first" "new second" )
...
for ((i=0;i<"${#mysentences[@]}";++i)); do
sed -i "s/${mysentences[$i]}/${mysentences2[$i]}/g" text.txt
done
警告,如果句子可以包含/
,则必须对其进行转义,如果它们可以包含正则表达式中具有特殊含义的字符,则可以使用\Q
和\E
在perl中转义。< / p>
perl -i -pe 's/\Q'"${mysentences[$i]//\//\\/}"'\E/'"${mysentences2[$i]//\//\\/}/g" text.txt
注意:它不安全,注射仍然可能
mysentences=( "bar" )
mysentences2=( '@{[`echo ok >&2`]}' )
perl -pe 's/\Q'"${mysentences[$i]//\//\\/}"'\E/'"${mysentences2[$i]//\//\\/}/g" <<<"foo bar baz"
将句子作为参数传递以防止注入
perl -pe 'BEGIN{$oldtext=shift;$newtext=shift}s/\Q$oldtext\E/$newtext/g' "${mysentences[$i]//\//\\/}" "${mysentences2[$i]//\//\\/}" <<<"foo bar baz"