bash.在循环中不正确地搜索和替换来自数组中的单词组合



我想用bash编写大规模搜索和替换单词组合的脚本。我有一个脚本:

#!/bin/bash
text="cm punk, dolph ziggler, duke nukem"
IFS=", "
my=( $text )
echo ${my[@]}
text2="the undertaker, john cena, the rock"
IFS=", "
my2=( $text2 )
echo ${my2[@]}
for ((i=0;i<${#my[@]};++i)); do
       sed -i "s/${my[i]}/${my2[i]}/g" text.txt
done

首先,它有效。我看到了结果,脚本更改了单词组合。但是,我决定在调试中看到:

+ (( i=0 ))
+ (( i<6 ))
+ sed -i s/cm/the/g text.txt
+ (( ++i ))
+ (( i<6 ))
+ sed -i s/punk/undertaker/g text.txt
+ (( ++i ))
+ (( i<6 ))
+ sed -i s/dolph/john/g text.txt
+ (( ++i ))
+ (( i<6 ))
+ sed -i s/ziggler/cena/g text.txt
+ (( ++i ))
+ (( i<6 ))
+ sed -i s/duke/the/g text.txt
+ (( ++i ))
+ (( i<6 ))
+ sed -i s/nukem/rock/g text.txt
+ (( ++i ))
+ (( i<6 ))

您如何看待,它可以通过单词进行搜索和替换。但是我需要swearch并替换单词组合。例如,我尝试仅在变量中使用一个单词组合(在调试中(:

sed -i 's/cm punk/the undertaker/g' text.txt

你的想法,我有错误的地方?

IFS变量不是将字符串分为代币的模式,而是用作分离器的字符列表。因此,通过设置IFS=", ",您可以声明您要将逗号作为代币定界符的空间。因此,要么您将直接初始化数组,例如:

my=("cm punk", "dolph ziggler", "duke nukem")

或修改text/text2变量,然后使用唯一的逗号作为分隔器:

text="cm punk,dolph ziggler,duke nukem"
IFS=","
my=( $text )

最新更新