我想在几个文档中替换几个字符串。我知道如何使用sed
选项合并-e
命令,但我不知道如何在脚本中将它们组合在一起运行多个文件。
我尝试使用' for'循环,但它没有工作。
for i in `ls *.txt`; do sed -e 's/22/twenty two/g' \ -e 's/23/twenty three/g'$i > new/$i; done
知道如何使用shell
,awk
,Python
或Perl
执行此操作吗?
答案 0 :(得分:6)
你在做:
for i in `ls *.txt`
do
sed -e 's/22/twenty two/g' \ -e 's/23/twenty three/g'$i > new/$i
^ ^^^
why is this here? missing space!
done
可以改写为:
for i in *.txt # <-- no need to `ls`!!
do
sed -e 's/22/twenty two/g' -e 's/23/twenty three/g' "$i" > new/"$i"
done
所以你的问题是:
\
。sed 's...'
与文件名之间缺少空格。并提出建议:
ls
,只需展开*.txt
。答案 1 :(得分:6)
如果您使用awk,则不需要循环
awk '{gsub(/22/,"twenty two");gsub(/23/,"twenty three");print > "new/"FILENAME}' *.txt
答案 2 :(得分:3)
如果你有很多替代品,你可能会喜欢这样的东西:
awk '
BEGIN {
map[22] = "twenty two"
map[23] = "twenty three"
}
{
for (old in map)
gsub("\\<" old "\\>", map[old])
print > ("new/" FILENAME)
}
' *.txt
单词边界(我使用GNU awk表示法)非常重要,因此123
不会成为1twenty three
。这是目前所有其他解决方案的问题。
答案 3 :(得分:1)
是的,你根本不需要'-e'sed选项,只需将命令与简单的“;”结合起来:
while read -r f; do
sed 's/22/twenty two/g; s/23/twenty three/g' "$f" > new/"$f"
done < <(ls *.txt)
您可以使用sed“就地”文件修改功能:
while read -r f; do
sed -i 's/22/twenty two/g; s/23/twenty three/g' "$f"
done < <(ls *.txt)