2012-07-04 41 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' 

問候。