我有一些名为C1_1_B_(1)IMG1511.jpg
的文件,我想把它们分成一个列表,然后我回来了
C1
1
B
(1)
IMG1511.jpg
试图弄明白我是否需要使用sed
或awk
或regex
执行此操作,或者甚至可以在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
答案 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