我正在尝试使用以下内容在几个文件中用逗号替换选项卡:
#!/bin/sh
for i in *output_*.txt
do
sed 's/ /;/g' $i > $i
done
但它不起作用,因为在输出文件中我仍然有制表符分隔符。当我在没有 for 循环的单个文件上使用它时,它才起作用。
有什么帮助吗?
谢谢。
有几件事是错误的。Unqouted 变量和输出重定向到同一个文件。也不需要循环。
尝试:
sed -i 's/ /;/g' *output_*.txt
您需要的正确脚本如下:
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>第 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