複数のテキストファイルを含むフォルダがあります。
apple.txt、book.txt、Tooth.txtなど
次のように、各テキストファイルを処理するために複数のsedコマンドを含むbashスクリプトを作成しました。
...
find /directory/. -type f -exec sed -i 's/one/two/g' {} \;
...
このラインはうまくいきます。
これらのタスクを実行するために、同様の方法(単一コマンド)ですべての個々のテキストファイルを処理する方法はありますか?
最長文字列から最短文字列に行を並べ替えます(各行には空白のない1つの文字列が含まれています)。
重複した行を削除してください。
答え1
単一のコマンドの要件が何であるかはよくわかりませんが、以下は非常に似ています。
(cd /directory/; find -type f -printf '%P\0' | while IFS= read -r -d '' fn; do
awk '{ print length, $0 }' "$fn" | sort -nur | sed -r 's/^[0-9]+ //' > "$fn.~"
mv "$fn.~" "$fn"
done)
最初の行は、可能な限り強力な方法でファイル名を読み取ります。
2行目では、すべての操作が行われます。
- awkは各行の先頭に文字数(+スペース)を追加します。
- -n(数値)、-u(固有)、-r(逆方向)プロセスファイルのソート
- sed 先行文字数の削除
- その後、一時ファイルにダンプされます。
その後、mv行は一時ファイルを元のファイルに書き込みます(パイプライン中に完了できないため)。