2012-07-04 96 views
1

我有一些逗号分隔字符串,并希望在bash使用剪切命令分割他们:如何拆分字符串,并使用打印所有子切

This, is a, sample input. 
This, is, another string, which could, appear, in my text, file. 

我也想打印输出的所有子。 第一个串的期望的输出是:

This 
is a 
sample input. 

,这是第二个串的期望输出:

This 
is 
another string 
which could 
appear 
in my text 
file. 

但由于逗号的数量(子串)是不固定在所有的字符串,我不知道如何告诉切割命令来显示所有的子字符串。 (例如,第一个字符串中有2个逗号,第二个中有6个)。有什么办法可以在bash中(通过剪切或其他命令)做到这一点?

我必须补充一点,虽然我在这篇文章中的例子是英文,但我的实际字符串是阿拉伯语。我的意思是我想要使用的命令必须能够使用Unicode字符。

+0

Bash是一个要求吗? Python 3 *中的unicode支持可能会更轻松地处理阿拉伯文本。 – Mizipzor

+0

不,这不是一个要求,但更好。由于我正在编写一个bash脚本来为这些字符串做一些其他的处理,所以我更愿意将它们分成bash。 (我的意思是我有一些文件,我想阅读它们,拆分它们的行并执行其他一些过程)。顺便说一句,如果没有另一个方便的工具来达到这个目的,我必须使用Perl进行分割... – Hakim

回答

2

仅仅因为你就想斩:

line='This, is a, sample input.' 
for i in $(seq 1 $(echo "$line," | tr -dc ',' | wc -c)); do 
    echo $line | cut -d, -f$i; 
done 
0

您也可以使用cutawk

example显示如何使用它们。

0

可以使用tr命令

IN="This, is a, sample input." 

arr=$(echo $IN | tr "," "\n") 

for x in $arr 
do 
    echo "$x" 
done 
3

我认为这个问题可以从两个方面来采取的方式。

  1. 以块为单位读取字符串,直到得到逗号。使用readbash的阵列
  2. 替换逗号(,)用换行(\n)。使用tr

IIRC,tr应该是unicode安全的,而sed取决于实施。我对此并不是100%确定的,我将不得不查看它。


使用猛砸阵列:使用tr

$ echo "μήλο, πορτοκάλι μπανάνα, αχλάδι" | tr ',' '\n' 
μήλο 
πορτοκάλι μπανάνα 
αχλάδι 

通知,这种替代会留下一个前导空格

$ IFS=, read -ra arr <<< "μήλο, πορτοκάλι μπανάνα, αχλάδι" 
$ printf "%s\n" "${arr[@]# }" 
μήλο 
πορτοκάλι μπανάνα 
αχλάδι 

,因言有空间在逗号后。

您可以通过再加工输出摆脱前导空格得逞的,
或预处理字符串逗号后剿空间


0

或者,如果你是不利的子进程,使用击:

str='This, is a, sample input.' 

IFS=',' 
set $str 
# Remove leading spaces 
while (($# > 0)) 
do 
    echo "${1# }"  
    shift 
done 

编辑:这里是一个Perl的解决方案:

use warnings; 
use strict; 

my $str = 'This, is a, sample input.'; 
my @subs = split(', ',$str); 

local $" = "\n"; 
print "@subs\n"; 
+0

在perl中这样做比bash更容易吗?它会怎样? – Hakim

+0

在Perl中稍微简单一些 - 取决于你需要如何处理子字符串。 – cdarke

2

我会要求您使用awk

$ echo "μήλο, πορτοκάλι, αχλάδι" | awk '{FS=", "}{for (i=1; i<=NF; i++) print $i}' 

这应该给

μήλο 
πορτοκάλι 
αχλάδι 
+0

@ c00kiemon5ter:我试过给一个新的线,这不accpet!你是怎样做的??无论如何感谢编辑! :) –

+0

如果您在行之前放置四个或更多空格,它将被格式化为代码。只需更改一行,在上一行的末尾留出两个空格。这是降价标记。在网上搜索更多关于它的信息;它现在无处不在。 – c00kiemon5ter

1

这应该工作:

aa="This, is a, sample input." 
bb="This, is, another string, which could, appear, in my text, file." 

echo $aa|tr ',' '\n' 

echo $bb|tr ',' '\n' 

问候。