使用sed在bash for循环中查找和替换

使用sed在bash for循环中查找和替换,bash,sed,Bash,Sed,我要替换文本文件中的大量单词 此脚本将一直运行到sed命令,我在其中获得: sed:1:“*.js”:无效的命令代码* PS。。。Bash不是我的强项之一——它不需要漂亮或高效 cd '/Users/xxxxxx/Sites/xxxxxx' echo `pwd`; for line in `cat myFile.txt` do export IFS=":" i=0 list=() for word in

我要替换文本文件中的大量单词

此脚本将一直运行到sed命令,我在其中获得:

sed:1:“*.js”:无效的命令代码*

PS。。。Bash不是我的强项之一——它不需要漂亮或高效

cd '/Users/xxxxxx/Sites/xxxxxx'
    echo `pwd`;

    for line in `cat myFile.txt`
    do
        export IFS=":"
        i=0
        list=()

        for word in $line; do
            list[$i]=$word
            i=$[i+1]
        done

        echo ${list[0]}
        echo ${list[1]}

        sed -i "s/{$list[0]}/{$list[1]}/g" *.js

    done
您正在运行BSD sed(在OSX下),因此
-i
标志需要一个参数来指定您想要的后缀


此外,没有文件与glob
*.js

匹配这看起来像是一个简单的打字错误:

sed -i "s/{$list[0]}/{$list[1]}/g" *.js
应该是:

sed -i "s/${list[0]}/${list[1]}/g" *.js

(就像上面的
echo
行一样)

因此
myFile.txt
包含一个从:到替换的列表,并且您正在循环每个替换。为什么不从这个文件创建一个
sed
脚本呢

cd '/Users/xxxxxx/Sites/xxxxxx'
sed -e 's/^/s:/' -e 's/$/:/' myFile.txt |
# Output from first sed script is a sed script!
# It contains substitutions like this:
# s:from:to:
# s:other:substitute:
sed -f - -i~ *.js
您的
sed
可能不喜欢
-f-
,这意味着
sed
应该从标准输入读取脚本。如果是这样的话,也许你可以创建一个像这样的临时脚本

sed -e 's/^/s:/' -e 's/$/:/' myFile.txt >script.sed
sed -f script.sed -i~ *.js

另一种方法是,如果您对sed不太自信,并且认为您将在一周内忘记巫毒符号的含义,那么可以更有效地使用IFS:

IFS=":"
cat myFile.txt | while read PATTERN REPLACEMENT  # You feed the while loop with stdout lines and read fields separated by ":"
do
   sed -i "s/${PATTERN}/${REPLACEMENT}/g"
done
我能看到的唯一陷阱(可能更多)是,如果模式或替换包含斜杠(/),它们将破坏sed表达式。 您可以使用不可打印的字符更改sed分隔符,这样应该是安全的。
无论如何,如果你知道myFile.txt上的内容,你可以随意使用。

作为一种风格,
echo`pwd`
是对echo的无用使用;只需
pwd
即可打印当前工作目录。类似地,在backticks中为
运行
for
循环
cat
也是对cat的无用使用。另见