2

我有一些逗号分隔的字符串,想在 bash 中使用 cut 命令将它们拆分:

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.

但由于逗号(子字符串)的数量在所有字符串中都不是固定的,我不知道如何告诉 cut 命令显示所有子字符串。(例如,第一个字符串中有 2 个逗号,第二个字符串中有 6 个)。有没有办法在 bash 中做到这一点(使用 cut 或其他命令)?

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

4

7 回答 7

4

在我看来,这个问题可以通过两种方式解决。

  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

您也可以使用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 回答
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 回答