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

时间:2011-11-02 01:13:54

标签: 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 $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

4 个答案:

答案 0 :(得分:2)

你正在运行BSD sed(在OS X下),因此-i标志需要一个参数来指定你想要后缀的内容。

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

答案 1 :(得分:1)

这看起来像一个简单的拼写错误:

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

应该是:

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

(就像上面的echo行)

答案 2 :(得分:1)

所以myFile.txt包含from:to substitutions的列表,并且你正在遍历每个。为什么不从这个文件创建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

答案 3 :(得分:0)

另一种方法,如果你对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

我能看到的唯一缺陷(可能更多)是,如果PATTERN或REPLACEMENT是否包含斜杠(/),它们将破坏你的sed表达式。 您可以使用不可打印的字符更改sed分隔符,您应该是安全的。 无论如何,如果你知道你的myFile.txt上有什么,你可以使用任何。