我想从如下所示的文件中提取数据:
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"
在第二个圆球。但是,每次读取命令都会剥离 '\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
也无济于事。那么,这是一种正确的方法吗?