如何通过命令行将此字符串转换为列表

时间:2011-10-27 01:55:47

标签: shell sed awk

我有一些名为C1_1_B_(1)IMG1511.jpg的文件,我想把它们分成一个列表,然后我回来了

 C1
 1
 B
 (1)
 IMG1511.jpg

试图弄明白我是否需要使用sedawkregex执行此操作,或者甚至可以在AppleScript中执行此操作,但我宁愿调用shell命令,因为它更快

修改

好的,现在它改变了一点,我可以弄清楚如何解决它

例子是

"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 个答案:

答案 0 :(得分:5)

_翻译成新行:

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 OS上,一个简单的转义工作:

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

输出:

C1
1
B
(1)
IMG1511.jpg

答案 1 :(得分:1)

这会吗?

 <<<"C1_1_B_(1)IMG1511.jpg" sed -r 'y/_/\n/;s/\([^)]*\)/&\n/g;'

答案 2 :(得分:1)

我知道它不是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;

答案 3 :(得分:0)

如果文件名存储在$ P中,则以下内容适用于zsh:

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

这会创建一个实际的数组。

答案 4 :(得分:0)

它处理在其他地方包含_ ( )的文件名。

<<< '
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

答案 5 :(得分:0)

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