Bash sed in循环

时间:2012-06-25 08:10:54

标签: bash sed

我正在尝试使用以下内容在几个文件中用逗号替换选项卡:

#!/bin/sh 
for i in *output_*.txt  
do   
sed 's/ /;/g' $i > $i 
done

但它不起作用,因为在输出文件中我仍然有制表符分隔符。当我在没有for循环的单个文件上使用它时,它就可以正常工作。

任何帮助?

感谢。

2 个答案:

答案 0 :(得分:3)

有些事情是错的。未调整的变量和输出重定向到同一文件中。也不需要循环。

尝试:     sed -i 's/ /;/g' *output_*.txt

答案 1 :(得分:0)

您需要的正确脚本如下:

find . -name '*output_*.txt' | while read FILENAME; do
    (sed -e "s/\\t/;/g" <${FILENAME} >${FILENAME%.txt}.tmp) && (mv ${FILENAME%.txt}.tmp ${FILENAME});
done

此脚本有几个重要功能:

  1. 它在当前目录和所有子目录中找到所有名为*output_*.txt的文件。如果想要递归到子目录中,请使用:

    find . -maxdepth 1 -name '*output_*.txt' | while read FILENAME; do
    

    作为第一行。

  2. 如果sed遇到错误,不会覆盖原始输入文件sed将其输出生成为临时文件(<filename>.tmp),只有在原始文件成功时才会替换原始文件。

  3. 正如其他海报所指出的,标签字符\t脚本中由sed表示。

  4. 此脚本执行的示例转换如下(序列<tab>代表标签字符):

    输入:     

        <tab><tab><tab><tab><tab>line 1<tab><tab>
        <tab><tab><tab>line 2<tab><tab>
        <tab><tab>line 3<tab><tab>
        <tab><tab><tab>line 4<tab><tab>
        <tab><tab><tab><tab><tab>line<tab><tab> 5
        

    输出:

        ;;;;line 1;;
        ;;;line 2;;
        ;;line 3;;
        ;;;line 4;;
        ;;;;;line;; 5