当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页
作者 内容
1 楼 
 文章标题 : 读取文本行进行处理。这么难啊。
帖子发表于 : 2006-08-14 23:11 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
for i in tmp "Exec ${fvwm}root-关机" "Pick Destroy" Restart
可以处理空格。下划线部分是一个文件的4行内容。

for i in `awk '{printf(" \"%s\"",$0)}' auto-menu.ini`
就根本不能处理空格了。输出是一样的结果。放到变量line里面,数据一样的。
for i in $line
也不行。

网上只看到用一个递增的计数变量cnt,每次用awk数出第cnt行,用while处理的。

read的数组,使用*输出都不行。这for 循环太不好用了。


_________________
● 鸣学


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2006-08-14 23:29 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
用awk里面的for呢?


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2006-08-14 23:36 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
用awk简直就是万能的。但是,我的大量操作都是在bash哦。如果用awk,肯定需要另起一个awk的输入文件了。而且还是需要bash做一些事情。麻烦的哦。


_________________
● 鸣学


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2006-08-15 0:30 
头像

注册: 2005-10-25 11:15
帖子: 1016
送出感谢: 0 次
接收感谢: 1
嗯,bash的这种foreach的用法有时确实不是太好使,一般用下面这个方法凑合一下也行
代码:
IFS='\n'
for i in `cat <<_EOF_
test test test
test test
test
_EOF_`; do
    echo $i
done

就是把分割符号定义为\n,不过如果是列文件名,而且文件名中包含回车,那也会很不爽,当然这种情况很少见。


_________________
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser


页首
 用户资料  
 
5 楼 
 文章标题 :
帖子发表于 : 2006-08-15 15:37 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
看过IFS,是3个分隔符号,没敢动,怕下面的恢复不对。你这样的在本bash里面不恢复了?


_________________
● 鸣学


页首
 用户资料  
 
6 楼 
 文章标题 :
帖子发表于 : 2006-08-15 17:19 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
今天看到这种用法,跟awk很类似了。
代码:
for ((i=1; i<3; i++)); do
    echo $i
done


页首
 用户资料  
 
7 楼 
 文章标题 :
帖子发表于 : 2006-08-15 17:45 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
OLDIFS=$IFS
IFS='\n'
read -a lines -d _EOF_ < temp
echo ${lines[@]}
IFS=$OLDIFS


页首
 用户资料  
 
8 楼 
 文章标题 :
帖子发表于 : 2006-08-15 18:36 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
新的bash都支持(())的写法。
read -a的也想过了。当时是想接受一行,然后lines[*]输出。就是觉得太难受。 :lol:
还用sed等都试过。就是不清楚为什么手动的写列表可以,而自动输出一样的数据的列表就不认。


_________________
● 鸣学


页首
 用户资料  
 
9 楼 
 文章标题 :
帖子发表于 : 2006-08-15 20:09 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
关键是awk输出内容中引号就是引号,没有特殊意义。


页首
 用户资料  
 
10 楼 
 文章标题 :
帖子发表于 : 2006-08-15 20:53 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
就是确定了bash解释文本信息(指手动写的)和命令输出的信息(``包括起来执行的结果)不同?
头天差点都用csh了的。


_________________
● 鸣学


页首
 用户资料  
 
11 楼 
 文章标题 :
帖子发表于 : 2006-08-15 21:50 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
bash处理for i in `awk '{printf(" \"%s\"",$0)}' auto-menu.ini` 的时候,应该是先unquoting,然后调用awk,再对awk的输出做word splitting。所以awk输出的引号仅仅被当作普通文本处理。


页首
 用户资料  
 
12 楼 
 文章标题 :
帖子发表于 : 2006-08-15 21:51 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
我是这么理解的:bash处理for i in `awk '{printf(" \"%s\"",$0)}' auto-menu.ini` 的时候,先unquoting,然后调用awk,再对awk的输出做word splitting。因为unquoting只进行一次,所以awk输出的引号仅仅被当作普通文本处理。


页首
 用户资料  
 
13 楼 
 文章标题 :
帖子发表于 : 2006-08-15 23:18 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
引用:
再对awk的输出做word splitting

这样理解确实可能了。

line="tmp \"Exec \${fvwm}root-关机\" \"Pick Destroy\" Restart"
echo $line
for i in $line

这样都不行的。看来用for 是死路了。


_________________
● 鸣学


页首
 用户资料  
 
14 楼 
 文章标题 :
帖子发表于 : 2006-08-16 12:17 
头像

注册: 2006-07-14 18:56
帖子: 345
地址: Apple Valley, Planet Tux, Linux System
送出感谢: 0 次
接收感谢: 0 次
exec 3<&0 0<auto-menu.ini
while read; do
...
done
exec 0<&3
或者
while read; do
...
done < auto-menu.ini
不过这两种方式把每一行的前导空格都截掉了。


页首
 用户资料  
 
15 楼 
 文章标题 :
帖子发表于 : 2006-09-02 3:13 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
闲来无事的时候,用eval把这个完成了。eval里面包含了子程序而已。


_________________
● 鸣学


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 16 篇帖子 ]  前往页数 1, 2  下一页

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译