我正在尝试使用以下内容在几个文件中用逗号替换选项卡:
#!/bin/sh
for i in *output_*.txt
do
sed 's/ /;/g' $i > $i
done
但它不起作用,因为在输出文件中我仍然有制表符分隔符。当我在没有for循环的单个文件上使用它时,它就可以正常工作。
任何帮助?
感谢。
答案 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
此脚本有几个重要功能:
它在当前目录和所有子目录中找到所有名为*output_*.txt
的文件。如果不想要递归到子目录中,请使用:
find . -maxdepth 1 -name '*output_*.txt' | while read FILENAME; do
作为第一行。
如果sed
遇到错误,不会覆盖原始输入文件。 sed
将其输出生成为临时文件(<filename>.tmp
),只有在原始文件成功时才会替换原始文件。
正如其他海报所指出的,标签字符在\t
脚本中由sed
表示。
此脚本执行的示例转换如下(序列<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