免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1515 | 回复: 5
打印 上一主题 下一主题

[文本处理] expect脚本能接受管道传递的参数吗? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2018-09-22 19:32 |只看该作者 |倒序浏览
expect脚本能接受管道传递的参数吗?
比如:
echo "v1 v2 v3" | script.exp

cat file.txt | script.exp

script.exp脚本想实现类似下面的功能:
while read v1 v2 v3
do
...
done

论坛徽章:
0
2 [报告]
发表于 2018-09-23 15:57 |只看该作者
本帖最后由 FunBSD 于 2018-09-23 16:04 编辑

好吧,论坛人气真得不行了。我自己来解答吧。
为了学个expect,连tcl一块学了。

从标准输入(STDIN)、文件(File)、SHELL读取内容的脚本。
测试方法:
  1. cat file.txt | expect -d script.exp

  2. echo -e "1 2 3 4\ra b c d" | expect -d script.exp
复制代码
脚本代码:
  1. #!/usr/bin/expect -f

  2. puts "从标准输入(STDIN)读取内容"
  3. set number 0
  4. while { [gets stdin line] >= 0 } {
  5.   incr number
  6.   puts "Line $number: $line"
  7.   puts "Line $number: [lindex $line 0],[lindex $line 1],[lindex $line 2]"
  8. }
  9. puts "STDIN line number: $number"
  10. puts "--------------------------"

  11. puts "从文件(File)读取内容"
  12. set number 0
  13. set file [open ./file.txt r]
  14. while { [gets $file line] >= 0 } {
  15.   incr number
  16.   puts "Line $number: $line"
  17.   puts "Line $number: [lindex $line 0],[lindex $line 1],[lindex $line 2]"
  18. }
  19. puts "File line number: $number"
  20. puts "--------------------------"
  21. close $file

  22. puts "从文件(File)读取内容,输出时比实际多1行"
  23. set number 0
  24. set file [open ./file.txt r]
  25. foreach line [ split [read $file] "\n" ] {
  26.   incr number
  27.   puts "Line $number: $line"
  28.   puts "Line $number: [lindex $line 0],[lindex $line 1],[lindex $line 2]"
  29.   foreach word [ regexp -all -inline {\S+} $line ] {
  30.     puts "$word"
  31.   }
  32. }
  33. puts "File line number: $number"
  34. puts "--------------------------"
  35. close $file

  36. puts "从文件(File)读取内容,输出时比实际多1行"
  37. set file [open ./file.txt r]
  38. while { ![eof $file] } {
  39.   set buffer [read $file 100000]
  40.   puts "$buffer"
  41. }
  42. puts "--------------------------"
  43. close $file

  44. #puts "从相同后缀的文件读取内容"
  45. #foreach filename [glob *.txt] {
  46. #  set file [open $filenamel
  47. #  #...
  48. #  close $file
  49. #}

  50. #puts "从SHELL读取内容"
  51. #set file [open {| find ./ -type f | xargs grep "content"} r]
  52. #set file [open "| find ./ -type f | xargs grep \"content\"" r]

复制代码



论坛徽章:
0
3 [报告]
发表于 2018-09-23 16:12 |只看该作者
补充:

line切分成word:
foreach word $line { ... }    #不能有特殊字符
foreach word [ lrange $line 0 end ] { ... }    #不能有特殊字符
foreach word [ lsearch -inline -all $line * ] { ... }    #不能有特殊字符
foreach word [ regexp -all -inline {\S+} $line ] { ... }    #可以有持特殊字符

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
4 [报告]
发表于 2018-09-23 20:01 |只看该作者
建议试试 expect_user

论坛徽章:
0
5 [报告]
发表于 2018-09-24 08:23 |只看该作者
回复 4# waker

给个例子,谢谢。

论坛徽章:
0
6 [报告]
发表于 2018-09-24 08:44 |只看该作者
找到方法。
  1. #!/usr/bin/expect -f

  2. send_user "Input Line: "
  3. expect_user -re "(.*)\n"
  4. set value $expect_out(1,string)
  5. puts "$value\r"
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP