次のようなファイルからデータを抽出したい:
BK20120802130531:/home/michael/Scripts/usb_backup.sh
BK20120802130531:/home/michael/Scripts/yad_0.17.1.1-1_i386.deb
BK20120802130731:/home/michael/Scripts/gbk.sh
BK20120802130131:/home/michael/Scripts/alt-notify-send.sh
BK20120802130131:/home/michael/Scripts/bk.bak
BK20120802130131:/home/michael/Scripts/bk.sh
BK20120802130131:/home/michael/Scripts/demande_password.sh
アイデアは、次の内容を画面に表示することです(一時ファイルを作成せず、元のファイルを変更することもありません):
alt-notify-send.sh
/home/michael/Scripts
bk.bak
/home/michael/Scripts
bk.sh
/home/michael/Scripts
demande_password.sh
/home/michael/Scripts
gbk.sh
/home/michael/Scripts
usb_backup.sh
/home/michael/Scripts
yad_0.17.1.1-1_i386.deb
/home/michael/Scripts
総括する :
- ':' の前の文字を取り除く
- ファイル名を対応するディレクトリの前に置きます
- ファイル名をアルファベット順に並べ替える
- 各ファイル名とそれに対応するディレクトリの間で改行を実行します
私はこれをすべて成功させましたが、ポイント#4に関する私のコードにはまだ醜いことがあります:
cut -f 2 -d ':' $big_file | \
sort -u | \
while read file ; do
echo "$(basename "$file")zipzapzupzop$(dirname "$file")" # <-- ugly thing #1
done | \
sort -dfb | \
while read line ; do
echo $line
done | \
sed 's/zipzapzupzop/\n/' # <-- ugly thing #2
最初に、私は書いていました:
echo "$(basename "$file")\n$(dirname "$file")"
醜いこと#1の代わりに、できるようにするために
echo -e "$line"
2番目のWhileブークレ。ただし、読み取りコマンドは「\ n」文字列を毎回削除するため、取得できます
alt-notify-send.shn/home/michael/Scripts
bk.bakn/home/michael/Scripts
bk.shn/home/michael/Scripts
demande_password.shn/home/michael/Scripts
gbk.shn/home/michael/Scripts
usb_backup.shn/home/michael/Scripts
yad_0.17.1.1-1_i386.debn/home/michael/Scripts
「\」文字を別の「\」で保護しようとしましたが、結果は同じです。
man read
も役に立ちません。それで、これを行うのは適切な方法ですか?