使用bash搜索和替换几个句子

时间:2017-06-07 11:47:32

标签: bash shell for-loop if-statement delimiter

现在,我有搜索和替换单词的脚本。我如何为句子或单词组合做同样的事情。 看看我的剧本:

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”。我应该在这个场所做些什么。可能是我应该处理一些分隔符。在第一种情况下,空格是单词的分隔符,但在这种情况下,我不能使用空格。我可以做什么 ?请帮忙。

1 个答案:

答案 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"