如何用数组中的元素替换文件中的单词

时间:2019-06-24 14:43:41

标签: arrays string bash replace str-replace

我正在尝试将所有“空”一词替换为数组中的元素。问题在于,在替换完一个单词“ null”之后,我想用数组中的下一个元素替换下一个“ null”。

我对bash不太满意,我觉得这是一个非常基本的问题。

这是我到目前为止所拥有的:

for m in $(cat finalfile.csv)
do
    if [ "$m" = "null" ]
    then
        m=cwearray[$counter]
        let counter++
    fi
done

这不会替换finalfile.csv中的任何内容。

例如,如果文件具有:

"value1","value2","null","value3"\n
"value1","value2","null","value3"...

并且数组具有[“ foo”,“ bar”]

我希望是这样

"value1","value2","foo","value3"\n
"value1","value2","bar","value3"...

4 个答案:

答案 0 :(得分:2)

在Perl中更容易,您可以在替换的替换部分直接增加索引:

printf '%s\n' 1,2,3,null null,2,3,4 null,null,null,null \
| perl -pe 'BEGIN { @cwe = qw( A B C D E F ) }
            s/(?:^|(?<=,))null(?=,|$)/$cwe[$i++]/g'

更新:看来您已经用示例输入更新了问题。如果将双引号括起来,则将变得更加容易,因为无需检查它们是否被逗号开头/结尾。

perl -pe 'BEGIN{ @cwe = qw( foo bar ) }
          s/"null"/"$cwe[$i++]"/g'

答案 1 :(得分:2)

可以使用bash进行操作,即使每行有多个null:

$ cat finalfile.csv
"value1","value2","null","null"
"value1","value2","null","value3"

$ cwearray=( foo bar baz )

$ idx=0

$ while read -r line; do 
    while [[ $line == *null* ]]; do 
      line=${line/null/${cwearray[idx++]}}
      # ...............^^^^^^^^^^^^^^^^^^
      # replace the _first_ "null" with the _next_ array element
    done
    echo "$line"
  done < finalfile.csv > updatedfinalfile.csv

$ cat updatedfinalfile.csv
"value1","value2","foo","bar"
"value1","value2","baz","value3"

答案 2 :(得分:0)

逐行读取文件。如果一行包含null,请使用sed将所有出现的null替换为通过数组索引检索的相应值。

#!/bin/bash

file="finalfile.csv"
counter=0

array=(
  "foo"
  "bar"
)

while read -r line; do
  item="${array[$counter]}"
  echo "$line" | sed "s/null/$item/g"
  ((counter++))
done < "$file"

答案 3 :(得分:0)

awk解决方案:

declare -a cwearray
cwearray=(foo bar)
awk -F, 'NR==FNR{repl[NR]=$0; next}{for(i=1;i<=NF;i++){if($i=="\"null\""){$i="\""repl[++counter]"\""}}}1' OFS="," <(for i in "${cwearray[@]}"; do echo "$i"; done) <file>