多个''命令' for'环

时间:2014-11-27 12:49:16

标签: bash for-loop sed

我想在几个文档中替换几个字符串。我知道如何使用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

知道如何使用shellawkPythonPerl执行此操作吗?

4 个答案:

答案 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)

使用“外部”数据时,“for”循环使用可能会有危险:当然,请尝试创建名称中包含空格的.txt文件。

是的,你根本不需要'-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)