我在文本文件中有大量单词要替换。
此脚本正在运行,直到我得到的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
答案 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上有什么,你可以使用任何。