免费注册 查看新帖 |

Chinaunix

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

system执行sed报错 [复制链接]

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-09-07 19:19 |只看该作者 |倒序浏览
本帖最后由 moperyblue 于 2016-07-18 16:36 编辑

有一文件file,内容如下:
10.0
5
1 SYBCHAR 0 255 "|" 19
2 SYBCHAR 0 255 "|" 16
3 SYBCHAR 0 255 "|" 6
4 SYBCHAR 0 255 "|" 7
5 SYBCHAR 0 255 "\n" 1
10.0
3
1 SYBCHAR 0 255 "|" 19
2 SYBCHAR 0 255 "|" 16
3 SYBCHAR 0 255 "\n" 6

现用perl 的system函数调用sed命令报错,请问是什么原因?
my $c1=qq{sed ':a;N;/\\n/!ba;s/\n/,/g' '/home/bcp_test/file'};
system ($c1);

==>

perl perl_bcp.pl
sed:-e 表达式 #1,字符 15:未终止的“s”命令

但在终端工具执行是可以的
sed ':a;N;/\\n/!ba;s/\n/,/g' '/home/bcp_test/file'
10.0,5,1 SYBCHAR 0 255 "|" 19,2 SYBCHAR 0 255 "|" 16,3 SYBCHAR 0 255 "|" 6,4 SYBCHAR 0 255 "|" 7,5 SYBCHAR 0 255 "\n" 1
10.0,3,1 SYBCHAR 0 255 "|" 19,2 SYBCHAR 0 255 "|" 16,3 SYBCHAR 0 255 "\n" 6


论坛徽章:
0
2 [报告]
发表于 2012-09-07 19:56 |只看该作者
本帖最后由 sjdy521 于 2012-09-07 20:03 编辑

既然有perl了。。。何必用sed
况且,你也完全可以用s2p把sed代码转成perl代码啊,不然看着真纠结,你的问题应该是qq{}导致原始的命令字符串被转义了
  1. s2p  ':a;N;/\\n/!ba;s/\n/,/g'



  2. #!/usr/bin/perl -w
  3. eval 'exec /usr/bin/perl -S $0 ${1+"$@"}'
  4.   if 0;
  5. $0 =~ s/^.*?(\w+)[\.\w+]*$/$1/;

  6. use strict;
  7. use Symbol;
  8. use vars qw{ $isEOF $Hold %wFiles @Q $CondReg
  9.              $doAutoPrint $doOpenWrite $doPrint };
  10. $doAutoPrint = 1;
  11. $doOpenWrite = 1;
  12. # prototypes
  13. sub openARGV();
  14. sub getsARGV(;\$);
  15. sub eofARGV();
  16. sub printQ();

  17. # Run: the sed loop reading input and applying the script
  18. #
  19. sub Run(){
  20.     my( $h, $icnt, $s, $n );
  21.     # hack (not unbreakable :-/) to avoid // matching an empty string
  22.     my $z = "\000"; $z =~ /$z/;
  23.     # Initialize.
  24.     openARGV();
  25.     $Hold    = '';
  26.     $CondReg = 0;
  27.     $doPrint = $doAutoPrint;
  28. CYCLE:
  29.     while( getsARGV() ){
  30.         chomp();
  31.         $CondReg = 0;   # cleared on t
  32. BOS:;
  33. # :a;N;/\\n/!ba;s/\n/,/g
  34. L_1:;
  35. EOS:    if( $doPrint ){
  36.             print $_, "\n";
  37.         } else {
  38.             $doPrint = $doAutoPrint;
  39.         }
  40.         printQ() if @Q;
  41.     }

  42.     exit( 0 );
  43. }
  44. Run();

  45. # openARGV: open 1st input file
  46. #
  47. sub openARGV(){
  48.     unshift( @ARGV, '-' ) unless @ARGV;
  49.     my $file = shift( @ARGV );
  50.     open( ARG, "<$file" )
  51.     || die( "$0: can't open $file for reading ($!)\n" );
  52.     $isEOF = 0;
  53. }

  54. # getsARGV: Read another input line into argument (default: $_).
  55. #           Move on to next input file, and reset EOF flag $isEOF.
  56. sub getsARGV(;\$){
  57.     my $argref = @_ ? shift() : \$_;
  58.     while( $isEOF || ! defined( $argref = <ARG> ) ){
  59.         close( ARG );
  60.         return 0 unless @ARGV;
  61.         my $file = shift( @ARGV );
  62.         open( ARG, "<$file" )
  63.         || die( "$0: can't open $file for reading ($!)\n" );
  64.         $isEOF = 0;
  65.     }
  66.     1;
  67. }

  68. # eofARGV: end-of-file test
  69. #
  70. sub eofARGV(){
  71.     return @ARGV == 0 && ( $isEOF = eof( ARG ) );
  72. }

  73. # makeHandle: Generates another file handle for some file (given by its path)
  74. #             to be written due to a w command or an s command's w flag.
  75. sub makeHandle($){
  76.     my( $path ) = @_;
  77.     my $handle;
  78.     if( ! exists( $wFiles{$path} ) || $wFiles{$path} eq '' ){
  79.         $handle = $wFiles{$path} = gensym();
  80.         if( $doOpenWrite ){
  81.             if( ! open( $handle, ">$path" ) ){
  82.                 die( "$0: can't open $path for writing: ($!)\n" );
  83.             }
  84.         }
  85.     } else {
  86.         $handle = $wFiles{$path};
  87.     }
  88.     return $handle;
  89. }

  90. # printQ: Print queued output which is either a string or a reference
  91. #         to a pathname.
  92. sub printQ(){
  93.     for my $q ( @Q ){
  94.         if( ref( $q ) ){
  95.             # flush open w files so that reading this file gets it all
  96.             if( exists( $wFiles{$q} ) && $wFiles{$q} ne '' ){
  97.                 open( $wFiles{$q}, ">>$q" );
  98.             }
  99.             # copy file to stdout: slow, but safe
  100.             if( open( RF, "<$q" ) ){
  101.                 while( defined( my $line = <RF> ) ){
  102.                     print $line;
  103.                 }
  104.                 close( RF );
  105.             }
  106.         } else {
  107.             print $q;
  108.         }
  109.     }
  110.     undef( @Q );
  111. }
复制代码

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
3 [报告]
发表于 2012-09-07 20:09 |只看该作者
回复 2# sjdy521


    哥 我对perl不熟 有没办法用到sed

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
4 [报告]
发表于 2012-09-07 20:26 |只看该作者
回复 2# sjdy521


    转换后怎么调用,perl如何进行行合并呢

论坛徽章:
0
5 [报告]
发表于 2012-09-07 20:28 |只看该作者
回复 3# moperyblue
  1. my $c1=q{sed ':a;N;/\\\n/!ba;s/\n/,/g' '/home/file'};
复制代码

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
6 [报告]
发表于 2012-09-07 20:43 |只看该作者
回复 5# sjdy521


good! 3Q!

解决
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP