重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

お世話になっております。

ファイル(テキスト)内には、改行を含んだ複数の行が記述されています。
これを1行にして上書き保存するシェルを実行をするための
シェルを作成したいと思っています。

ファイル内には以下のような値が改行を含んで入っています。

123
456
789

→これを、「123456789」と改行を取り除き、既存のファイルの上書き保存をしたい


なお、改行を含んだ対象のファイルは、ファイル名にある文字を含む
ファイルのみに対して行いたいのですが。

例:ファイル名に、「*abc*」、「*def*」、「*xyz*」を含むファイルが対象

改行を取り除くコマンドはわかるのですが、シェルにするプロセスがわかりません。

cat 入力ファイル名 | tr -d '\n' > 変換後の出力ファイル名


ご教授いただきたく、よろしくお願いします。

A 回答 (3件)

こんな感じでしょうか。



find -name \*abc\* -o -name \*def\* -o -name \*xyz\* |
xargs perl -pi -e 's/\n//g'

元ファイルを.bakとして残しておきたいのであれば

find -name \*abc\* -o -name \*def\* -o -name \*xyz\*
xargs perl -pi.bak -e 's/\n//g'
    • good
    • 0
この回答へのお礼

entree様

ありがとうございます
うまくできました
助かりました

お礼日時:2011/05/11 11:34

同じようなものですが、私なら・・・


カレントディレクトリ下にあるファイルが対象。(再帰検索あり)

#!/bin/sh

pwd=`pwd`
for f in `find $pwd -name "*abc*" -o -name "*def*" -o -name "*xyz*"`
do
tmpfile=/tmp/$$.`basename $f`
cat $f | tr -d '\n' > $tmpfile
mv $tmpfile $f
done

必ず実行権限をつけてください。
    • good
    • 0
この回答へのお礼

gfe様

ありがとうございます
うまく動きました
助かりました

お礼日時:2011/05/11 11:35

> 改行を取り除くコマンドはわかるのですが、シェルにするプロセスがわかりません。



実行可能なファイルにするということでしょうか。
であれば、以下のようなファイルを作って実行権限を付与すれば良いです。

----------------------------------------
#!/bin/bash

for file_path in ./*abc* ./*def* ./*xyz*
do
mv $file_path ${file_path}.tmp
cat ${file_path}.tmp | tr -d '\n' > ${file_path}
done
----------------------------------------

※注意事項
カレントディレクトリにあるファイルが対象です。
対象ファイル数が異常に多いとエラーになります。
実行完了後、問題なさそうであれば ./*.tmp で元ファイルを消す必要があります。
    • good
    • 0
この回答へのお礼

helonpa 様

うまくできました。ありがとうございました。

お礼日時:2011/05/15 01:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!