как я могу преобразовать эту строку в список через командную строку - PullRequest
0 голосов
/ 27 октября 2011

У меня есть файлы с именами, такими как C1_1_B_(1)IMG1511.jpg, и я хочу разделить их на список, где я возвращаюсь как

 C1
 1
 B
 (1)
 IMG1511.jpg

, пытаясь выяснить, нужно ли мне сделать это с sed или awk или regex, или даже как бы это выглядело, я мог бы сделать это в appleScript, но я бы скорее вызвал команду shell, так как она намного быстрее

EDIT

Хорошо, теперь это немного изменилось, и я могу понять, как это исправить.

Например:

"P24-M_(1)Lighter_Ray_Logo_Full_Color.jpg" 
"P24_(1)24x36loren.jpg" 

, поэтому _ (*) ​​указывает, где я хочу прекратить перечисление, поэтому яв конечном итоге с

P24
M
(1)
Lighter_Ray_Logo_Full_Color.jpg

и

P24
(1)
24x36loren.jpg

Ответы [ 6 ]

5 голосов
/ 27 октября 2011

Перевести _ в новые строки:

echo "C1_1_B_(1)IMG1511.jpg" | tr '_' '\n'

Вывод:

C1
1
B
(1)IMG1511.jpg

Хотя, похоже, вы хотите разделить и на ).Нет, можно сделать с tr, но ...

echo "C1_1_B_(1)IMG1511.jpg" | tr '_' '\n' | sed -e 's/)/)\
/'

Внутри есть строка перевода , которая необходима для Mac.На других * nix ОС работает простой escape:

echo "C1_1_B_(1)IMG1511.jpg" | tr '_' '\n' | sed -e 's/)/)\n/'

Вывод:

C1
1
B
(1)
IMG1511.jpg
1 голос
/ 06 декабря 2011

Я знаю, что это не sed / awk, но вот что работает в perl:

#!/usr/bin/perl

while(<STDIN>) {
  my($line) = $_;
  chomp($line);

  my @values = split(/_|(\(\d+\))/, $line);

    foreach my $val (@values) {
    if ( $val !~ m/^$/)
    {
        print "$val\n";
    }
  }
}
exit 0;
1 голос
/ 27 октября 2011

Будет ли это делать?

 <<<"C1_1_B_(1)IMG1511.jpg" sed -r 'y/_/\n/;s/\([^)]*\)/&\n/g;'
0 голосов
/ 27 октября 2011
str="C1_1_B_(1)IMG1511.jpg"
ary=( $(IFS=_; echo $str) )

for ((idx=0; idx < ${#ary[@]}; idx++)); do echo ${ary[$idx]}; done

выходы

C1
1
B
(1)IMG1511.jpg
0 голосов
/ 27 октября 2011

Это обрабатывает имена файлов, которые содержат _ ( ) в других местах.

<<< '
C1_1_B_(1)IMG151).jpg
C1_1_B_(1)IMG_(4444).jpg
C(22)2_1_22_333_B_(144)I_M_G_(_1511).jpg
' sed -nr '# isolate, process and print first section 
             s/^([^(]+)_/\1\n/;h
             s/(.*)\n.*/\1/
             s/([^_]+)_/\1\n/gp;x
           # process the second section 
             s/.*\n(.*)/\1/
             s/([^)]+\))/\1\n/p
           ';exit
0 голосов
/ 27 октября 2011

Если имя файла хранится в $ P, с zsh работает следующее:

myarr=${(s/_/)$(echo $P | sed 's/)/)_/g')}

Это создает фактический массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...