2

カンマ区切りの文字列がいくつかあり、bashでcutコマンドを使用してそれらを分割したいと思います。

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

また、出力のすべての部分文字列を出力したいと思います。最初の文字列の目的の出力は次のとおりです。

This
is a
sample input.

これは、2番目の文字列の目的の出力です。

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

しかし、すべての文字列でカンマ(部分文字列)の数が固定されていないため、すべての部分文字列を表示するようにcutコマンドに指示する方法がわかりません。(たとえば、最初の文字列に2つのコンマがあり、2番目の文字列に6つのコンマがあります)。これをbashで(cutまたは他のコマンドを使用して)行う方法はありますか?

この投稿の私の例は英語ですが、実際の文字列はアラビア語です。つまり、使用したいコマンドは、Unicode文字を処理できる必要があります。

4

7 に答える 7

4

私の見方では、問題には2つの方法でアプローチできます。

  1. カンマが表示されるまで、文字列をチャンクで読み取ります。使用readbash配列
  2. カンマ(,)を改行()に置き換えます\n。を使用しtrます。

IIRCは、実装に依存しますがtr、Unicodeで安全である必要があります。sed私はこれについて100%確信が持てません、私はそれを調べなければなりません。


Bash配列を使用する:

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

を使用してtr

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

単語にはコンマの後にスペースがあるため、この置換では先頭にスペースが残ることに注意してください。

出力を再処理して先頭のスペース
を削除するか、文字列を前処理してコンマの後のスペースを抑制することで、これを回避できます。


于 2012-07-04T08:26:22.190 に答える
2

これにはawkを使用してください!!

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

これは与えるべきです

μήλο
πορτοκάλι
αχλάδι
于 2012-07-04T08:40:11.077 に答える
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
于 2012-07-04T08:41:33.043 に答える
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'

よろしく。

于 2015-07-13T21:08:49.733 に答える
0

または、子プロセスに不利な場合は、Bashを使用してください。

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";
于 2012-07-04T08:34:25.303 に答える
0

cutawkも使用できます。

このは、それらの使用方法を示しています。

于 2012-07-04T08:22:07.790 に答える
0

trコマンドを使用できます

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

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

for x in $arr
do
    echo "$x"
done
于 2012-07-04T08:25:45.663 に答える