0

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

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

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

有什么帮助吗?

谢谢。

4

2 回答 2

3

有几件事是错误的。Unqouted 变量和输出重定向到同一个文件。也不需要循环。

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

于 2012-06-25T08:15:03.563 回答
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. 如果遇到错误,它不会覆盖您的原始输入文件。将其输出生成到一个临时文件 ( ),并且只有在成功时才会替换原始文件。sedsed<filename>.tmp

  3. 正如其他海报所指出的,制表符\tsed脚本中由 表示。

此脚本执行的示例转换如下(序列<tab>表示一个制表符):

输入:

    <tab><tab><tab><tab><tab>第 1 行<tab><tab>
    <tab><tab><tab>第 2 行<tab><tab>
    <tab><tab>第 3 行<tab><tab>
    <tab><tab><tab>第 4 行<tab><tab>
    <tab><tab><tab><tab><tab>行<tab><tab> 5
    

输出:

    ;;;;line 1;;
    ;;;line 2;;
    ;;line 3;;
    ;;;line 4;;
    ;;;;;line;; 5
于 2012-06-26T06:21:01.110 回答