bash sed命令中的字符串数组



for循环对于sed只循环一次。以下代码

中缺少的任何内容
#!/bin/bash
declare -a array=("string1" "string2" "string3" string4")
arraylength=${#array[@]}
for (( i=o; i<${arraylength}; i++))
do
dest="${array[$i]}"
echo $dest
sed -i 's/name1/'"$dest"'/g' /home/input.txt
cp /home/input.txt  /home/inputmodified.txt
done

在上面的代码中,当echo打印数组的所有字符串时,但是在文件/home/input.txt中,只替换第一个字符串。

echo $dest
string1
string2
string3
string4
cat /home/input.txt
this is string1
this is string1

我需要像

这样的数据
this is string1
this is string1
this is string2
this is string2
this is string3
this is string3
this is string4
this is string4

在循环的第一次迭代中,sed -i命令替换所有出现的"name1"在文件中使用"string1"在第二次、第三次等迭代中,没有出现&;name1&;(它们都被"string1"替换了),所以sed找不到任何要替换的内容。

而不是对原始文件(-i)进行就地修改,我认为您想要的是输出修改后的版本,但不更改原始。此外,使用cp不会添加到输出文件中,它替换了,因此唯一存在的是在最后一次迭代中复制的内容。

#!/bin/bash
declare -a array=("string1" "string2" "string3" "string4")
for value in "${array[@]}"; do
sed "s/name1/$value/g" /home/input.txt
done >/home/inputmodified.txt

我做的其他更改:

  • 要遍历数组的内容,您不需要计算数组索引,只需使用for value in "${array[@]}"直接获取元素。
  • 我简化了sed命令字符串的引用。没有任何东西需要单引号,所以把整个东西放在双引号里是可以的。如果在实际的搜索字符串中有任何非常奇怪的东西,您可能必须将其更改回来(或转义有趣的字符)。
  • 每个sed命令将文件的修改版本输出到其标准输出;done之后的>重定向将整个循环的标准输出重定向到文件,因此所有迭代都被添加到该文件中。
  • …但这意味着我必须删除echo $value(无论如何应该是echo "$value"),因为它将与sed的输出一起添加到输出文件中。如果你想把它作为调试输出,把它发送到标准错误而不是echo "$value" >&2的标准输出。

顺便说一句,我建议通过shellcheck.net运行脚本,因为它会捕获许多常见的shell脚本错误。

最新更新