#!/usr/bin/perl # Test misc. # Copyright (C) 2017-2022 Free Software Foundation, Inc. # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . use strict; use File::stat; (my $program_name = $0) =~ s|.*/||; # Turn off localization of executable's output. @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; my $prog = 'sed'; print "PATH = $ENV{PATH}\n"; my @Tests = ( ['empty', qw(-e ''), {IN=>''}, {OUT=>''}], ['empty2', q('s/^ *//'), {IN=>"x\n\n"}, {OUT=>"x\n\n"}], ['head', qw(3q), {IN=>"1\n2\n3\n4\n"}, {OUT=>"1\n2\n3\n"}], ['space', q('s/_\S/XX/g;s/\s/_/g'), {IN=> "Hello World\t!\nSecond_line_ of tests\n" }, {OUT=> "Hello_World_!\nSecondXXine__of_tests\n" }], ['zero-anchor', qw(-z), q('N;N;s/^/X/g;s/^/X/mg;s/$/Y/g;s/$/Y/mg'), {IN=>"a\0b\0c\0" }, {OUT=>"XXaY\0XbY\0XcYY\0" }], ['case-insensitive', qw(-n), q('h;s/Version: *//p;g;s/version: *//Ip'), {IN=>"Version: 1.2.3\n" }, {OUT=>"1.2.3\n1.2.3\n" }, ], ['preserve-missing-EOL-at-EOF', q('s/$/x/'), {IN=> "a\nb" }, {OUT=>"ax\nbx" }, ], ['y-bracket', q('y/[/ /'), {IN => "Are you sure (y/n)? [y]\n" }, {OUT=> "Are you sure (y/n)? y]\n" }, ], ['y-zero', q('y/b/\x00/'), {IN => "abc\n" }, {OUT=> "a\0c\n" }, ], ['y-newline', q('H G y/Ss\nYy/yY$sS/'), {IN => "Are you sure (y/n)? [y]\n" }, {OUT=> 'Are Sou Yure (S/n)? [S]$$Are Sou Yure (S/n)? [S]'."\n"}, ], ['allsub', q('s/foo/bar/g'), {IN => "foo foo fo oo f oo foo foo foo foo foo foo foo foo foo\n"}, {OUT=> "bar bar fo oo f oo bar bar bar bar bar bar bar bar bar\n"}, ], ['insert-nl', qw(-f), {IN => "/foo/i\\\n"}, {IN => "bar\nfoo\n" }, {OUT=> "bar\n\nfoo\n" }, ], ['recall', # Check that the empty regex recalls the last *executed* regex, # not the last *compiled* regex qw(-f), {IN => "p;s/e/X/p;:x;s//Y/p;/f/bx"}, {IN => "eeefff\n" }, {OUT=> "eeefff\n" . "Xeefff\n" . "XYefff\n" . "XYeYff\n" . "XYeYYf\n" . "XYeYYY\n" . "XYeYYY\n" }, ], ['recall2', # Starting from sed 4.1.3, regexes are compiled with REG_NOSUB # if they are used in an address, so that the matcher does not # have to obey leftmost-longest. The tricky part is to recompile # them if they are then used in a substitution. qw(-f), {IN => '/\(ab*\)\+/ s//>\1 "ababb||abbbabbbb\n" }, {OUT=> ">abb<||>abbbb<\n" }, ], ['0range', # Test address 0 (GNU extension) # FIXME: This test does NOT actually fail if the address is changed to 1. qw(-e '0,/aaa/d'), {IN => "1\n" . "2\n" . "3\n" . "4\n" . "aaa\n" . "yes\n"}, {OUT => "yes\n"} ], ['amp-escape', # Test ampersand as escape sequence (ASCII 0x26), which should # not have a special meaning (i.e. the 'matched pattern') qw(-e 's/yes/yes\x26/'), {IN => "yes\n"}, {OUT => "yes&\n"} ], ['appquit', # Test 'a'ppend command before 'q'uit qw(-f), {IN => q(a\ ok q)}, {IN => "doh\n"}, {OUT => "doh\n" . "ok\n"} ], ['brackets', qw(-f), {IN => q(s/[[]/a/ s/[[[]/b/ s/[[[[]/c/ s/[[[[[]/d/ s/[[[[[[]/e/ s/[[[[[[[]/f/ s/[[[[[[[[]/g/ s/[[[[[[[[[]/h/ )}, {IN => "[[[[[[[[[\n"}, {OUT => "abcdefgh[\n"} ], ['bkslashes', # Test backslashes in regex # bug in sed 4.0b qw(-f), {IN => q(s/$/\\\\\ / )}, {IN => "a\n"}, {OUT => "a\\\n" . "\n"} ], ['classes', # inspired by an autoconf generated configure script. qw(-n -f), {IN => 's/^\([/[:lower:]A-Z0-9]*_cv_[[:lower:][:upper:]/[:digit:]]*\)'. '=\(.*\)/: \${\1=\'\2\'}/p'}, {IN => "_cv_=emptyvar\n" . "ac_cv_prog/RANLIB=/usr/bin/ranlib\n" . "ac_cv_prog/CC=/usr/unsupported/\\ \\ /lib/_cv_/cc\n" . "a/c_cv_prog/CPP=/usr/bin/cpp\n" . "SHELL=bash\n" . "GNU=GNU!UNIX\n"}, {OUT => ": \${_cv_='emptyvar'}\n" . ": \${ac_cv_prog/RANLIB='/usr/bin/ranlib'}\n" . ": \${ac_cv_prog/CC='/usr/unsupported/\\ \\ /lib/_cv_/cc'}\n" . ": \${a/c_cv_prog/CPP='/usr/bin/cpp'}\n"} ], ['cv-vars', # inspired by an autoconf generated configure script. qw(-n -f), {IN => q|s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/: \${\1='\2'}/p|}, {IN => "_cv_=emptyvar\n" . "ac_cv_prog_RANLIB=/usr/bin/ranlib\n" . "ac_cv_prog_CC=/usr/unsupported/\ \ /lib/_cv_/cc\n" . "ac_cv_prog_CPP=/usr/bin/cpp\n" . "SHELL=bash\n" . "GNU=GNU!UNIX\n"}, {OUT => ": \${_cv_='emptyvar'}\n" . ": \${ac_cv_prog_RANLIB='/usr/bin/ranlib'}\n" . ": \${ac_cv_prog_CC='/usr/unsupported/\ \ /lib/_cv_/cc'}\n" . ": \${ac_cv_prog_CPP='/usr/bin/cpp'}\n"} ], ['quiet', # the old 'quiet' test: --quiet instead of -n qw(--quiet -f), {IN => q|s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/: \${\1='\2'}/p|}, {IN => "_cv_=emptyvar\n" . "ac_cv_prog_RANLIB=/usr/bin/ranlib\n" . "ac_cv_prog_CC=/usr/unsupported/\ \ /lib/_cv_/cc\n" . "ac_cv_prog_CPP=/usr/bin/cpp\n" . "SHELL=bash\n" . "GNU=GNU!UNIX\n"}, {OUT => ": \${_cv_='emptyvar'}\n" . ": \${ac_cv_prog_RANLIB='/usr/bin/ranlib'}\n" . ": \${ac_cv_prog_CC='/usr/unsupported/\ \ /lib/_cv_/cc'}\n" . ": \${ac_cv_prog_CPP='/usr/bin/cpp'}\n"} ], ['file', # the old 'file' test: --file instead of -f qw(-n --file), {IN => q|s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/: \${\1='\2'}/p|}, {IN => "_cv_=emptyvar\n" . "ac_cv_prog_RANLIB=/usr/bin/ranlib\n" . "ac_cv_prog_CC=/usr/unsupported/\ \ /lib/_cv_/cc\n" . "ac_cv_prog_CPP=/usr/bin/cpp\n" . "SHELL=bash\n" . "GNU=GNU!UNIX\n"}, {OUT => ": \${_cv_='emptyvar'}\n" . ": \${ac_cv_prog_RANLIB='/usr/bin/ranlib'}\n" . ": \${ac_cv_prog_CC='/usr/unsupported/\ \ /lib/_cv_/cc'}\n" . ": \${ac_cv_prog_CPP='/usr/bin/cpp'}\n"} ], ['dollar', # Test replacement on the last line (address '$') qw(-e '$s/^/space /'), {IN => "I can't quite remember where I heard it,\n" . "but I can't seem to get out of my head\n" . "the phrase\n" . "the final frontier\n"}, {OUT => "I can't quite remember where I heard it,\n" . "but I can't seem to get out of my head\n" . "the phrase\n" . "space the final frontier\n"} ], ['enable', # inspired by an autoconf generated configure script. qw(-e 's/-*enable-//;s/=.*//'), {IN => "--enable-targets=sparc-sun-sunos4.1.3,srec\n" . "--enable-x11-testing=on\n" . "--enable-wollybears-in-minnesota=yes-id-like-that\n"}, {OUT => "targets\n" . "x11-testing\n" . "wollybears-in-minnesota\n"} ], ['fasts', # test `fast' substitutions qw(-f), {IN => q( h s/a// p g s/a//g p g s/^a//p g s/^a//g p g s/not present//g p g s/^[a-z]//g p g s/a$// p g y/a/b/ h s/b// p g s/b//g p g s/^b//p g s/^b//g p g s/^[a-z]//g p g s/b$// p g )}, {IN => "aaaaaaabbbbbbaaaaaaa\n"}, {OUT => "aaaaaabbbbbbaaaaaaa\n" . "bbbbbb\n" . "aaaaaabbbbbbaaaaaaa\n" . "aaaaaabbbbbbaaaaaaa\n" . "aaaaaaabbbbbbaaaaaaa\n" . "aaaaaabbbbbbaaaaaaa\n" . "aaaaaaabbbbbbaaaaaa\n" . "bbbbbbbbbbbbbbbbbbb\n" . "\n" . "bbbbbbbbbbbbbbbbbbb\n" . "bbbbbbbbbbbbbbbbbbb\n" . "bbbbbbbbbbbbbbbbbbb\n" . "bbbbbbbbbbbbbbbbbbb\n" . "bbbbbbbbbbbbbbbbbbbb\n"} ], ['factor', # Compute a few common factors for speed. Clear the subst flag # These are placed here to make the flow harder to understand :-) # The quotient of dividing by 11 is a limit to the remaining prime factors # Pattern space looks like CANDIDATE\nNUMBER. When a candidate is valid, # the number is divided and the candidate is tried again # We have a prime factor in CANDIDATE! Print it # If NUMBER = 1, we don't have any more factors qw(-n -f), {IN => q~ s/.*/&;9aaaaaaaaa8aaaaaaaa7aaaaaaa6aaaaaa5aaaaa4aaaa3aaa2aa1a0/ :encode s/\(a*\)\([0-9]\)\([0-9]*;.*\2\(a*\)\)/\1\1\1\1\1\1\1\1\1\1\4\3/ tencode s/;.*// t7a :2 a\ 2 b2a :3 a\ 3 b3a :5 a\ 5 b5a :7 a\ 7 :7a s/^\(aa*\)\1\{6\}$/\1/ t7 :5a s/^\(aa*\)\1\{4\}$/\1/ t5 :3a s/^\(aa*\)\1\1$/\1/ t3 :2a s/^\(aa*\)\1$/\1/ t2 /^a$/b s/^\(aa*\)\1\{10\}/\1=&/ :factor /^\(a\{7,\}\)=\1\1*$/! { # Decrement CANDIDATE, and search again if it is still >1 s/^a// /^aa/b factor # Print the last remaining factor: since it is stored in the NUMBER # rather than in the CANDIDATE, swap 'em: now NUMBER=1 s/\(.*\)=\(.*\)/\2=\1/ } h s/=.*/;;0a1aa2aaa3aaaa4aaaaa5aaaaaa6aaaaaaa7aaaaaaaa8aaaaaaaaa9/ :decode s/^\(a*\)\1\{9\}\(a\{0,9\}\)\([0-9]*;.*[^a]\2\([0-9]\)\)/\1\4\3/ /^a/tdecode s/;.*//p g :divide s/^\(a*\)\(=b*\)\1/\1\2b/ tdivide y/b/a/ /aa$/bfactor ~}, {IN => "2\n" . "3\n" . "4\n" . "5\n" . "8\n" . "11\n" . "16\n" . "143\n"}, {OUT => "2\n" . "3\n" . "2\n" . "2\n" . "5\n" . "2\n" . "2\n" . "2\n" . "11\n" . "2\n" . "2\n" . "2\n" . "2\n" . "13\n" . "11\n"} ], ['flipcase', qw(-f), {IN => q|s,\([^A-Za-z]*\)\([A-Za-z]*\),\1\L\u\2,g|}, {IN => "09 - 02 - 2002 00.00 Tg La7 La7 -\n" . "09 - 02 - 2002 00.00 Brand New Tmc 2 -\n" . "09 - 02 - 2002 00.10 Tg1 Notte Rai Uno -\n" . "09 - 02 - 2002 00.15 Tg Parlamento Rai Due -\n" . "09 - 02 - 2002 00.15 Kung Fu - La Leggenda Continua La7 -\n" . "09 - 02 - 2002 00.20 Berserk - La CoNFESSIONE Di Gatz" . " Italia 1 Cartoon\n" . "09 - 02 - 2002 00.20 Tg3 - Tg3 Meteo Rai TrE -\n" . "09 - 02 - 2002 00.25 Meteo 2 Rai Due -\n" . "09 - 02 - 2002 00.30 Appuntamento Al CinEMA RaI Due -\n" . "09 - 02 - 2002 00.30 Rai Educational - Mediamente Rai Tre -\n" . "09 - 02 - 2002 00.35 Profiler Rai Due -\n" . "09 - 02 - 2002 00.35 Stampa OggI - Che Tempo Fa Rai Uno -\n" . "09 - 02 - 2002 00.45 Rai Educational - Babele: Euro Rai Uno -\n" . "09 - 02 - 2002 00.45 BollettINO Della NEVE RETE 4 News\n" . "09 - 02 - 2002 00.50 STUDIO Aperto - La Giornata Italia 1 News\n" . "09 - 02 - 2002 00.50 BOCCA A Bocca - 2 Tempo Rete 4 Film\n" . "09 - 02 - 2002 01.00 AppuntAMENTO Al Cinema Rai Tre -\n" . "09 - 02 - 2002 01.00 Music NoN Stop Tmc 2 -\n" . "09 - 02 - 2002 01.00 Studio SpORT Italia 1 SporT\n" . "09 - 02 - 2002 01.00 Tg 5 - Notte Canale 5 News\n" . "09 - 02 - 2002 01.05 Fuori Orario. CosE (Mai) Viste Rai Tre -\n" . "09 - 02 - 2002 01.15 RAINOTTE Rai Due -\n" . "09 - 02 - 2002 01.15 Sottovoce Rai Uno -\n" . "09 - 02 - 2002 01.15 GiOCHI Olimpici InVERNALI - CERIMONIA" . " Di Apertura Rai Tre -\n" . "09 - 02 - 2002 01.17 Italia Interroga Rai Due -\n"}, {OUT => "09 - 02 - 2002 00.00 Tg La7 La7 -\n" . "09 - 02 - 2002 00.00 Brand New Tmc 2 -\n" . "09 - 02 - 2002 00.10 Tg1 Notte Rai Uno -\n" . "09 - 02 - 2002 00.15 Tg Parlamento Rai Due -\n" . "09 - 02 - 2002 00.15 Kung Fu - La Leggenda Continua La7 -\n" . "09 - 02 - 2002 00.20 Berserk - La Confessione Di Gatz" . " Italia 1 Cartoon\n" . "09 - 02 - 2002 00.20 Tg3 - Tg3 Meteo Rai Tre -\n" . "09 - 02 - 2002 00.25 Meteo 2 Rai Due -\n" . "09 - 02 - 2002 00.30 Appuntamento Al Cinema Rai Due -\n" . "09 - 02 - 2002 00.30 Rai Educational - Mediamente Rai Tre -\n" . "09 - 02 - 2002 00.35 Profiler Rai Due -\n" . "09 - 02 - 2002 00.35 Stampa Oggi - Che Tempo Fa Rai Uno -\n" . "09 - 02 - 2002 00.45 Rai Educational - Babele: Euro Rai Uno -\n" . "09 - 02 - 2002 00.45 Bollettino Della Neve Rete 4 News\n" . "09 - 02 - 2002 00.50 Studio Aperto - La Giornata Italia 1 News\n" . "09 - 02 - 2002 00.50 Bocca A Bocca - 2 Tempo Rete 4 Film\n" . "09 - 02 - 2002 01.00 Appuntamento Al Cinema Rai Tre -\n" . "09 - 02 - 2002 01.00 Music Non Stop Tmc 2 -\n" . "09 - 02 - 2002 01.00 Studio Sport Italia 1 Sport\n" . "09 - 02 - 2002 01.00 Tg 5 - Notte Canale 5 News\n" . "09 - 02 - 2002 01.05 Fuori Orario. Cose (Mai) Viste Rai Tre -\n" . "09 - 02 - 2002 01.15 Rainotte Rai Due -\n" . "09 - 02 - 2002 01.15 Sottovoce Rai Uno -\n" . "09 - 02 - 2002 01.15 Giochi Olimpici Invernali - Cerimonia" . " Di Apertura Rai Tre -\n" . "09 - 02 - 2002 01.17 Italia Interroga Rai Due -\n"} ], ['inclib', # inspired by an autoconf generated configure script. qw(-e 's;lib;include;'), {IN => " /usr/X11R6/lib\n" . " /usr/X11R5/lib\n" . " /usr/X11R4/lib\n" . "\n" . " /usr/lib/X11R6\n" . " /usr/lib/X11R5\n" . " /usr/lib/X11R4\n" . "\n" . " /usr/local/X11R6/lib\n" . " /usr/local/X11R5/lib\n" . " /usr/local/X11R4/lib\n" . "\n" . " /usr/local/lib/X11R6\n" . " /usr/local/lib/X11R5\n" . " /usr/local/lib/X11R4\n" . "\n" . " /usr/X11/lib\n" . " /usr/lib/X11\n" . " /usr/local/X11/lib\n" . " /usr/local/lib/X11\n" . "\n" . " /usr/X386/lib\n" . " /usr/x386/lib\n" . " /usr/XFree86/lib/X11\n" . "\n" . " /usr/lib\n" . " /usr/local/lib\n" . " /usr/unsupported/lib\n" . " /usr/athena/lib\n" . " /usr/local/x11r5/lib\n" . " /usr/lpp/Xamples/lib\n" . "\n" . " /usr/openwin/lib\n" . " /usr/openwin/share/lib\n"}, {OUT => " /usr/X11R6/include\n" . " /usr/X11R5/include\n" . " /usr/X11R4/include\n" . "\n" . " /usr/include/X11R6\n" . " /usr/include/X11R5\n" . " /usr/include/X11R4\n" . "\n" . " /usr/local/X11R6/include\n" . " /usr/local/X11R5/include\n" . " /usr/local/X11R4/include\n" . "\n" . " /usr/local/include/X11R6\n" . " /usr/local/include/X11R5\n" . " /usr/local/include/X11R4\n" . "\n" . " /usr/X11/include\n" . " /usr/include/X11\n" . " /usr/local/X11/include\n" . " /usr/local/include/X11\n" . "\n" . " /usr/X386/include\n" . " /usr/x386/include\n" . " /usr/XFree86/include/X11\n" . "\n" . " /usr/include\n" . " /usr/local/include\n" . " /usr/unsupported/include\n" . " /usr/athena/include\n" . " /usr/local/x11r5/include\n" . " /usr/lpp/Xamples/include\n" . "\n" . " /usr/openwin/include\n" . " /usr/openwin/share/include\n"} ], ['khadafy', # The Khadafy test is brought to you by Scott Anderson . . . qw(-f), {IN => '/M[ou]\'\{0,1\}am\{1,2\}[ae]r' . ' .*' . '\([AEae]l[- ]\)\{0,1\}' . '[GKQ]h\{0,1\}[aeu]\{1,\}\([dtz][dhz]\{0,1\}\)\{1,\}af[iy]/!d'}, {IN => "1) Muammar Qaddafi\n" . "2) Mo'ammar Gadhafi\n" . "3) Muammar Kaddafi\n" . "4) Muammar Qadhafi\n" . "5) Moammar El Kadhafi\n" . "6) Muammar Gadafi\n" . "7) Mu'ammar al-Qadafi\n" . "8) Moamer El Kazzafi\n" . "9) Moamar al-Gaddafi\n" . "10) Mu'ammar Al Qathafi\n" . "11) Muammar Al Qathafi\n" . "12) Mo'ammar el-Gadhafi\n" . "13) Moamar El Kadhafi\n" . "14) Muammar al-Qadhafi\n" . "15) Mu'ammar al-Qadhdhafi\n" . "16) Mu'ammar Qadafi\n" . "17) Moamar Gaddafi\n" . "18) Mu'ammar Qadhdhafi\n" . "19) Muammar Khaddafi\n" . "20) Muammar al-Khaddafi\n" . "21) Mu'amar al-Kadafi\n" . "22) Muammar Ghaddafy\n" . "23) Muammar Ghadafi\n" . "24) Muammar Ghaddafi\n" . "25) Muamar Kaddafi\n" . "26) Muammar Quathafi\n" . "27) Muammar Gheddafi\n" . "28) Muamar Al-Kaddafi\n" . "29) Moammar Khadafy\n" . "30) Moammar Qudhafi\n" . "31) Mu'ammar al-Qaddafi\n" . "32) Mulazim Awwal Mu'ammar Muhammad Abu Minyar al-Qadhafi\n"}, {OUT => "1) Muammar Qaddafi\n" . "2) Mo'ammar Gadhafi\n" . "3) Muammar Kaddafi\n" . "4) Muammar Qadhafi\n" . "5) Moammar El Kadhafi\n" . "6) Muammar Gadafi\n" . "7) Mu'ammar al-Qadafi\n" . "8) Moamer El Kazzafi\n" . "9) Moamar al-Gaddafi\n" . "10) Mu'ammar Al Qathafi\n" . "11) Muammar Al Qathafi\n" . "12) Mo'ammar el-Gadhafi\n" . "13) Moamar El Kadhafi\n" . "14) Muammar al-Qadhafi\n" . "15) Mu'ammar al-Qadhdhafi\n" . "16) Mu'ammar Qadafi\n" . "17) Moamar Gaddafi\n" . "18) Mu'ammar Qadhdhafi\n" . "19) Muammar Khaddafi\n" . "20) Muammar al-Khaddafi\n" . "21) Mu'amar al-Kadafi\n" . "22) Muammar Ghaddafy\n" . "23) Muammar Ghadafi\n" . "24) Muammar Ghaddafi\n" . "25) Muamar Kaddafi\n" . "26) Muammar Quathafi\n" . "27) Muammar Gheddafi\n" . "28) Muamar Al-Kaddafi\n" . "29) Moammar Khadafy\n" . "30) Moammar Qudhafi\n" . "31) Mu'ammar al-Qaddafi\n" . "32) Mulazim Awwal Mu'ammar Muhammad Abu Minyar al-Qadhafi\n"} ], ['linecnt', qw(-e '='), {IN => "A dialogue on poverty\n" . "\n" . " On the night when the rain beats,\n" . " Driven by the wind,\n" . " On the night when the snowflakes mingle\n" . " With a sleety rain,\n" . " I feel so helplessly cold.\n" . " I nibble at a lump of salt,\n" . " Sip the hot, oft-diluted dregs of _sake_;\n" . " And coughing, snuffling,\n" . " And stroking my scanty beard,\n" . " I say in my pride,\n" . " \"There's none worthy, save I!\"\n" . " But I shiver still with cold.\n" . " I pull up my hempen bedclothes,\n" . " Wear what few sleeveless clothes I have,\n" . " But cold and bitter is the night!\n" . " As for those poorer than myself,\n" . " Their parents must be cold and hungry,\n" . " Their wives and children beg and cry.\n" . " Then, how do you struggle through life?\n" . "\n" . " Wide as they call the heaven and earth,\n" . " For me they have shrunk quite small;\n" . " Bright though they call the sun and moon,\n" . " They never shine for me.\n" . " Is it the same with all men,\n" . " Or for me alone?\n" . " By rare chance I was born a man\n" . " And no meaner than my fellows,\n" . " But, wearing unwadded sleeveless clothes\n" . " In tatters, like weeds waving in the sea,\n" . " Hanging from my shoulders,\n" . " And under the sunken roof,\n" . " Within the leaning walls,\n" . " Here I lie on straw\n" . " Spread on bare earth,\n" . " With my parents at my pillow,\n" . " And my wife and children at my feet,\n" . " All huddled in grief and tears.\n" . " No fire sends up smoke\n" . " At the cooking-place,\n" . " And in the cauldron\n" . " A spider spins its web.\n" . " With not a grain to cook,\n" . " We moan like the night thrush.\n" . " Then, \"to cut,\" as the saying is,\n" . " \"The ends of what is already too short,\"\n" . " The village headman comes,\n" . " With rod in hand, to our sleeping place,\n" . " Growling for his dues.\n" . " Must it be so hopeless --\n" . " The way of this world?\n" . "\n" . " -- Yamanoue Okura\n"}, {OUT => "1\n" . "A dialogue on poverty\n" . "2\n" . "\n" . "3\n" . " On the night when the rain beats,\n" . "4\n" . " Driven by the wind,\n" . "5\n" . " On the night when the snowflakes mingle\n" . "6\n" . " With a sleety rain,\n" . "7\n" . " I feel so helplessly cold.\n" . "8\n" . " I nibble at a lump of salt,\n" . "9\n" . " Sip the hot, oft-diluted dregs of _sake_;\n" . "10\n" . " And coughing, snuffling,\n" . "11\n" . " And stroking my scanty beard,\n" . "12\n" . " I say in my pride,\n" . "13\n" . " \"There's none worthy, save I!\"\n" . "14\n" . " But I shiver still with cold.\n" . "15\n" . " I pull up my hempen bedclothes,\n" . "16\n" . " Wear what few sleeveless clothes I have,\n" . "17\n" . " But cold and bitter is the night!\n" . "18\n" . " As for those poorer than myself,\n" . "19\n" . " Their parents must be cold and hungry,\n" . "20\n" . " Their wives and children beg and cry.\n" . "21\n" . " Then, how do you struggle through life?\n" . "22\n" . "\n" . "23\n" . " Wide as they call the heaven and earth,\n" . "24\n" . " For me they have shrunk quite small;\n" . "25\n" . " Bright though they call the sun and moon,\n" . "26\n" . " They never shine for me.\n" . "27\n" . " Is it the same with all men,\n" . "28\n" . " Or for me alone?\n" . "29\n" . " By rare chance I was born a man\n" . "30\n" . " And no meaner than my fellows,\n" . "31\n" . " But, wearing unwadded sleeveless clothes\n" . "32\n" . " In tatters, like weeds waving in the sea,\n" . "33\n" . " Hanging from my shoulders,\n" . "34\n" . " And under the sunken roof,\n" . "35\n" . " Within the leaning walls,\n" . "36\n" . " Here I lie on straw\n" . "37\n" . " Spread on bare earth,\n" . "38\n" . " With my parents at my pillow,\n" . "39\n" . " And my wife and children at my feet,\n" . "40\n" . " All huddled in grief and tears.\n" . "41\n" . " No fire sends up smoke\n" . "42\n" . " At the cooking-place,\n" . "43\n" . " And in the cauldron\n" . "44\n" . " A spider spins its web.\n" . "45\n" . " With not a grain to cook,\n" . "46\n" . " We moan like the night thrush.\n" . "47\n" . " Then, \"to cut,\" as the saying is,\n" . "48\n" . " \"The ends of what is already too short,\"\n" . "49\n" . " The village headman comes,\n" . "50\n" . " With rod in hand, to our sleeping place,\n" . "51\n" . " Growling for his dues.\n" . "52\n" . " Must it be so hopeless --\n" . "53\n" . " The way of this world?\n" . "54\n" . "\n" . "55\n" . " -- Yamanoue Okura\n"} ], ['manis', # straight out of an autoconf-generated configure. # The input should look just like the input after this is run. # # Protect against being on the right side of a sed subst in config.status. qw(-f), {IN => q(s/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\\\&%]/\\\\&/g; s/@@/%@/; s/@@/@%/; s/@g$/%g/ )}, {IN => "s\%\@CFLAGS\@\%\%g\n" . "s\%\@CPPFLAGS\@\%-I/\%g\n" . "s\%\@CXXFLAGS\@\%-x c++\%g\n" . "s\%\@DEFS\@\%\$DEFS\%g\n" . "s\%\@LDFLAGS\@\%-L/usr/lib\%g\n" . "s\%\@LIBS\@\%-lgnu -lbfd\%g\n" . "s\%\@exec_prefix\@\%\%g\n" . "s\%\@prefix\@\%\$prefix\%g\n" . "s\%\@RANLIB\@\%\$RANLIB\%g\n" . "s\%\@CC\@\%/usr/local/bin/gcc\%g\n" . "s\%\@CPP\@\%\$CPP\%g\n" . "s\%\@XCFLAGS\@\%\$XCFLAGS\%g\n" . "s\%\@XINCLUDES\@\%\$XINCLUDES\%g\n" . "s\%\@XLIBS\@\%\$XLIBS\%g\n" . "s\%\@XPROGS\@\%\$XPROGS\%g\n" . "s\%\@TCLHDIR\@\%\$TCLHDIR\%g\n" . "s\%\@TCLLIB\@\%\$TCLLIB\%g\n" . "s\%\@TKHDIR\@\%\$TKHDIR\%g\n" . "s\%\@TKLIB\@\%\$TKLIB\%g\n" . "s\%\@PTY_TYPE\@\%\$PTY_TYPE\%g\n" . "s\%\@EVENT_TYPE\@\%\$EVENT_TYPE\%g\n" . "s\%\@SETUID\@\%\$SETUID\%g\n"}, {OUT => "s\%\@CFLAGS\@\%\%g\n" . "s\%\@CPPFLAGS\@\%-I/\%g\n" . "s\%\@CXXFLAGS\@\%-x c++\%g\n" . "s\%\@DEFS\@\%\$DEFS\%g\n" . "s\%\@LDFLAGS\@\%-L/usr/lib\%g\n" . "s\%\@LIBS\@\%-lgnu -lbfd\%g\n" . "s\%\@exec_prefix\@\%\%g\n" . "s\%\@prefix\@\%\$prefix\%g\n" . "s\%\@RANLIB\@\%\$RANLIB\%g\n" . "s\%\@CC\@\%/usr/local/bin/gcc\%g\n" . "s\%\@CPP\@\%\$CPP\%g\n" . "s\%\@XCFLAGS\@\%\$XCFLAGS\%g\n" . "s\%\@XINCLUDES\@\%\$XINCLUDES\%g\n" . "s\%\@XLIBS\@\%\$XLIBS\%g\n" . "s\%\@XPROGS\@\%\$XPROGS\%g\n" . "s\%\@TCLHDIR\@\%\$TCLHDIR\%g\n" . "s\%\@TCLLIB\@\%\$TCLLIB\%g\n" . "s\%\@TKHDIR\@\%\$TKHDIR\%g\n" . "s\%\@TKLIB\@\%\$TKLIB\%g\n" . "s\%\@PTY_TYPE\@\%\$PTY_TYPE\%g\n" . "s\%\@EVENT_TYPE\@\%\$EVENT_TYPE\%g\n" . "s\%\@SETUID\@\%\$SETUID\%g\n"} ], ['modulo', qw(-e '0~2d;='), {IN => "s\%\@CFLAGS\@\%\%g\n" . "s\%\@CPPFLAGS\@\%-I/\%g\n" . "s\%\@CXXFLAGS\@\%-x c++\%g\n" . "s\%\@DEFS\@\%\$DEFS\%g\n" . "s\%\@LDFLAGS\@\%-L/usr/lib\%g\n" . "s\%\@LIBS\@\%-lgnu -lbfd\%g\n" . "s\%\@exec_prefix\@\%\%g\n" . "s\%\@prefix\@\%\$prefix\%g\n" . "s\%\@RANLIB\@\%\$RANLIB\%g\n" . "s\%\@CC\@\%/usr/local/bin/gcc\%g\n" . "s\%\@CPP\@\%\$CPP\%g\n" . "s\%\@XCFLAGS\@\%\$XCFLAGS\%g\n" . "s\%\@XINCLUDES\@\%\$XINCLUDES\%g\n" . "s\%\@XLIBS\@\%\$XLIBS\%g\n" . "s\%\@XPROGS\@\%\$XPROGS\%g\n" . "s\%\@TCLHDIR\@\%\$TCLHDIR\%g\n" . "s\%\@TCLLIB\@\%\$TCLLIB\%g\n" . "s\%\@TKHDIR\@\%\$TKHDIR\%g\n" . "s\%\@TKLIB\@\%\$TKLIB\%g\n" . "s\%\@PTY_TYPE\@\%\$PTY_TYPE\%g\n" . "s\%\@EVENT_TYPE\@\%\$EVENT_TYPE\%g\n" . "s\%\@SETUID\@\%\$SETUID\%g\n"}, {OUT => "1\n" . "s\%\@CFLAGS\@\%\%g\n" . "3\n" . "s\%\@CXXFLAGS\@\%-x c++\%g\n" . "5\n" . "s\%\@LDFLAGS\@\%-L/usr/lib\%g\n" . "7\n" . "s\%\@exec_prefix\@\%\%g\n" . "9\n" . "s\%\@RANLIB\@\%\$RANLIB\%g\n" . "11\n" . "s\%\@CPP\@\%\$CPP\%g\n" . "13\n" . "s\%\@XINCLUDES\@\%\$XINCLUDES\%g\n" . "15\n" . "s\%\@XPROGS\@\%\$XPROGS\%g\n" . "17\n" . "s\%\@TCLLIB\@\%\$TCLLIB\%g\n" . "19\n" . "s\%\@TKLIB\@\%\$TKLIB\%g\n" . "21\n" . "s\%\@EVENT_TYPE\@\%\$EVENT_TYPE\%g\n"} ], ['middle', qw(-n -e '3,5p'), {IN => q( "...by imposing a tiny bit of order in a communication you are translating, you are carving out a little bit of order in the universe. You will never succeed. Everything will fail and come to an end finally. But you have a chance to carve a little bit of order and maybe even beauty out of the raw materials that surround you everywhere, and I think there is no greater meaning in life." Donald L. Philippi, Oct 1930 - Jan 1993 )}, {OUT => q( universe. You will never succeed. Everything will fail and come to an end finally. But you have a chance to carve a little bit of order and maybe even beauty out of the raw materials that )} ], ['newline-anchor', qw(-f), {IN => q(N N s/^/X/g s/^/X/mg s/$/Y/g s/$/Y/mg )}, {IN => "a\n" . "b\n" . "c\n"}, {OUT => "XXaY\n" . "XbY\n" . "XcYY\n"} ], ['noeolw', qw(-n -f), # The sed program: # generates two output files (in addition to STDOUT) {IN => q(w noeolw.1out $ { x w noeolw.1out x } h 1,3w noeolw.2out p p )}, # The input file (was: noeolw.inp). # NOTE: in the old test, the input file was given twice. # here we specify two (identical) input files. {IN => "This file is unique\n" . "in that it does\n" . "end in a newline."}, {IN => "This file is unique\n" . "in that it does\n" . "end in a newline."}, # The expected STDOUT (was: noeolw.good) {OUT => "This file is unique\n" . "This file is unique\n" . "in that it does\n" . "in that it does\n" . "end in a newline.\n" . "end in a newline.\n" . "This file is unique\n" . "This file is unique\n" . "in that it does\n" . "in that it does\n" . "end in a newline.\n" . "end in a newline."}, # The expected content of 'noeolw.1out' (was: noeolw.1good) {CMP => [ "This file is unique\n" . "in that it does\n" . "end in a newline.\n" . "This file is unique\n" . "in that it does\n" . "end in a newline.\n" . "in that it does\n", { 'noeolw.1out' => undef }]}, # The expected content of 'noeolw.2out' (was: noeolw.2good) {CMP => [ "This file is unique\n" . "in that it does\n" . "end in a newline.", { 'noeolw.2out' => undef }]}, ], ['numsub', qw(-f), {IN => q( # the first one matches, the second doesn't 1s/foo/bar/10 2s/foo/bar/20 # The second line should be deleted. ssed 3.55-3.58 do not. t d )}, {IN => q(foo foo fo oo f oo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo fo oo f oo foo foo foo foo foo foo foo foo foo foo foo foo foo )}, {OUT => "foo foo fo oo f oo foo foo foo foo " . "foo foo foo bar foo foo foo foo foo\n"} ], ['numsub2', qw(-n -e 's/a*/b/2'), {IN => "\n"}, {OUT => ""} ], ['numsub3', qw(-n -e 's/^a*/b/2'), {IN => "\n"}, {OUT => ""} ], ['numsub4', qw(-n -e 's/^a*/b/2p'), {IN => "z\n"}, {OUT => ""} ], ['numsub5', qw(-n -e 's/a*/b/3p'), {IN => "z\n"}, {OUT => ""} ], ['readin', qw(-f), {IN => q(/\.$/r readin.in2 /too\.$/q )}, {AUX => { 'readin.in2' => "MOO\n" }}, {IN => "``Democracy will not come today, this year,\n" . " nor ever through compromise and fear.\n" . " I have as much right as the other fellow has\n" . " to stand on my two feet and own the land.\n" . " I tire so of hearing people say\n" . " let things take their course,\n" . " tomorrow is another day.\n" . " I do not need my freedom when I'm dead.\n" . " I cannot live on tomorrow's bread.\n" . " Freedom is a strong seed\n" . " planted in a great need.\n" . " I live here, too.\n" . " I want freedom just as you.''\n" . " ``The Weary Blues'', Langston Hughes\n"}, {OUT => "``Democracy will not come today, this year,\n" . " nor ever through compromise and fear.\n" . "MOO\n" . " I have as much right as the other fellow has\n" . " to stand on my two feet and own the land.\n" . "MOO\n" . " I tire so of hearing people say\n" . " let things take their course,\n" . " tomorrow is another day.\n" . "MOO\n" . " I do not need my freedom when I'm dead.\n" . "MOO\n" . " I cannot live on tomorrow's bread.\n" . "MOO\n" . " Freedom is a strong seed\n" . " planted in a great need.\n" . "MOO\n" . " I live here, too.\n" . "MOO\n"} ], ['sep', # inspired by an autoconf generated configure script. qw(-f), {IN => q(s%/[^/][^/]*$%% s%[\/][^\/][^\/]*$%% s,.*[^\/],, )}, {IN => "miss mary mack mack//mack/ran down/the track track track\n" . "slashes\aren't%used enough/in/casual-conversation///\n" . "possibly sentences would be more attractive if they ended" . "in two slashes//\n"}, {OUT => "\n" . "///\n" . "//\n"} ], ['subwrite', # test s///w option qw(-e 's/you/YoU/w subwrite.wout'), {IN => "Not some church, and not the state,\n" . "Not some dark capricious fate.\n" . "Who you are, and when you lose,\n" . "Comes only from the things you choose.\n"}, # The expected STDOUT {OUT => "Not some church, and not the state,\n" . "Not some dark capricious fate.\n" . "Who YoU are, and when you lose,\n" . "Comes only from the things YoU choose.\n"}, # The expected content of 'writeout.wout' {CMP => [ "Who YoU are, and when you lose,\n" . "Comes only from the things YoU choose.\n", { 'subwrite.wout' => undef }]} ], ['writeout', # Test 'w' command qw(-e '/^Facts ar/w writeout.wout'), {IN => "Facts are simple and facts are straight\n" . "Facts are lazy and facts are late\n" . "Facts all come with points of view\n" . "Facts don't do what I want them to\n"}, # The expected STDOUT {OUT => "Facts are simple and facts are straight\n" . "Facts are lazy and facts are late\n" . "Facts all come with points of view\n" . "Facts don't do what I want them to\n"}, # The expected content of 'writeout.wout' {CMP => [ "Facts are simple and facts are straight\n" . "Facts are lazy and facts are late\n", { 'writeout.wout' => undef }]} ], ['xabcx', # from the ChangeLog (Fri May 21 1993) # Regex address with custom character (\xREGEXx) qw(-e '\xfeetxs/blue/too/'), {IN => "roses are red\n" . "violets are blue\n" . "my feet are cold\n" . "your feet are blue\n"}, {OUT => "roses are red\n" . "violets are blue\n" . "my feet are cold\n" . "your feet are too\n"} ], ['xbxcx', # from the ChangeLog (Wed Sep 5 2001) qw(-e 's/a*/x/g'), {IN => "\n" . "b\n" . "bc\n" . "bac\n" . "baac\n" . "baaac\n" . "baaaac\n"}, {OUT => "x\n" . "xbx\n" . "xbxcx\n" . "xbxcx\n" . "xbxcx\n" . "xbxcx\n" . "xbxcx\n"} ], ['xbxcx3', # Test s///N replacements (GNU extension) qw(-e 's/a*/x/3'), {IN => "\n" . "b\n" . "bc\n" . "bac\n" . "baac\n" . "baaac\n" . "baaaac\n"}, {OUT => "\n" . "b\n" . "bcx\n" . "bacx\n" . "baacx\n" . "baaacx\n" . "baaaacx\n"} ], # Four backslashes (2 pairs of "\\") to pass through two interpolations: # once in Perl, then the shell command line argument. # sed will see one backslash character in the s/// command. ['bug30794_1', "s/z/\\\\x5cA/", {IN=>'z'}, {OUT => "\\A"}], ['bug30794_2', "s/z/\\\\x5c/", {IN=>'z'}, {OUT => "\\"}], ['bug30794_3', "s/z/\\\\x5c1/", {IN=>'z'}, {OUT => "\\1"}], ['bug40242', q('sn\nnXn'), {IN=>'n'}, {OUT => 'X'}], ); my $save_temps = $ENV{SAVE_TEMPS}; my $verbose = $ENV{VERBOSE}; my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose); exit $fail;