bash

2017-06-07 4 views
0

を使用して複数の文章を検索して置き換えると、単語を検索して置き換えるスクリプトがあります。どのように文章や単語の組み合わせに対しても同じことができます。bash

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 

それは動作しますが、唯一の単語で単語を置き換える: 私のスクリプトで確認してください。しかし、私はいくつかの単語の組み合わせでいくつかの単語の組み合わせを置き換えたい場合。 たとえば、「dolph ziggler、john cena、randy orton」「cm punk、hulk hogan、rey mysterio」に置き換えたいとします。私はこの会合で何をすべきか。私はいくつかの区切り文字を処理する必要があります。最初のケースでは、スペースは単語の区切り文字ですが、この状況ではスペースを使用できません。私は何ができますか ?助けてください。

+1

を防ぐために、引数として文章を渡すことは可能、安全、注射ではありません配列に直接代入するだけですか? – 123

+0

はすべてのスクリプトではないためです。それはスクリプトの一部です。私は変数で入力パラメータを使用する必要があります。 – Piduna

+0

どのように要素の開始と終了を決定していますか? – 123

答えて

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でエスケープすることができます含めることができます。

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" 
+1

'var1 =" $ {mysentences [$ i] // \/// \\ /} "var2 =" $ {mysentences2 [$ i] // \ // \\ /} "perl -pe '/ \ Q $ ENV {" var1 "} \ E/$ ENV {" var2 "}/g' <<<" foo bar baz "' – 123

+0

@ 123はい、また次のように渡すことができます。最初の2つの引数 –

+0

これらは引数ではなく、後に実行されるプロセスに対してenv変数が設定されています。 – 123