Perl + Przetłumacz składnię skryptu powłoki na perl + wyrażenie regularne

1

W moim /var/tmpmam następujące pliki:

 ls | grep FILE
   AAA-FILE.xml
   BBB-FILE.xml

Za pomocą następującego polecenia wycinam pierwsze słowo plików w następujący sposób:

ls /var/tmp | grep FILE.xml | sed "s/.FILE.*//"

Dostaję:

AAA
BBB

Jak mogę zrobić to samo z Perlem, aby wstawić „AAA” i „BBB” do @RESULTS? Na przykład:

@RESULTS=perl syntax ...
Yael
źródło
1
UUOG:sed -n "/FILE.xml/s/.FILE.*//p"
Ignacio Vazquez-Abrams
to nie jest perl, proszę zobaczyć odpowiedź
b0fh
1
I dlatego nie jest to odpowiedź.
Ignacio Vazquez-Abrams

Odpowiedzi:

3

Zakładając, że nadal chcesz używać istniejącego polecenia, możesz to zrobić

my @results = `ls /var/tmp | grep FILE.xml | sed "s/.FILE.*//"`;
chomp for @results;

Chomp polega na pozbyciu się nowej linii.

Bez uciekania się do wywoływania zewnętrznych poleceń:

my @results;
opendir DIR,"/var/tmp" or die "Cannot open dir: $!";
for (readdir DIR) {
    /(.*)-FILE.*/ or next;
    push @results, $1;
}
closedir DIR;
b0fh
źródło
THX bardzo dobrze Wybieram drugą opcję w moim skrypcie perl
yael
coś jeszcze, jak zmienić składnię w przypadku, gdy „-” nie pojawia się na przykład z AAA1FILE.xml, zwróci AAA1
yael
Można zastąpić to ls|grep|sedzsed -ne's/.FILE.*//p' /var/tmp
Evan Carroll
2

@RESULTS = grep(s[/var/tmp/(.*)-FILE.xml][$1],</var/tmp/*>);

Dave Webb
źródło
2
@RESULTS = map /(.*)-FILE\.xml$/, <*-FILE.xml>;
jdporter
źródło
1
@RESULTS = map m#/var/tmp/(.*)-FILE.xml#, </var/tmp/*-FILE.xml>;
jdporter
źródło
1
perl -nE'next unless s/-FILE.*//; push state @lines, $_; die @lines if eof;' /var/tmp
Evan Carroll
źródło