以下を使用して、いくつかのファイルでタブをコンマに置き換えようとしています:
#!/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>line<tab><tab> 5
出力:
;;;;line 1;;
;;;line 2;;
;;line 3;;
;;;line 4;;
;;;;;line;; 5