使用sed在bash for循环中查找和替换
我要替换文本文件中的大量单词 此脚本将一直运行到sed命令,我在其中获得: sed:1:“*.js”:无效的命令代码* PS。。。Bash不是我的强项之一——它不需要漂亮或高效使用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
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的无用使用。另见