如何拆分字符串并使用剪切打印所有子字符串

时间:2012-07-04 08:16:42

标签: linux bash text cut

我有一些逗号分隔的字符串,并希望在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中执行此操作(使用剪切或其他命令)?

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

7 个答案:

答案 0 :(得分:3)

我认为可以通过两种方式解决问题。

  1. 以字块形式读取字符串,直到您收到逗号。使用 read bash数组
  2. 用换行符(,)替换逗号(\n)。使用 tr
  3. IIRC,tr应该是unicode安全的,而sed取决于实施。我不是100%肯定这一点,我将不得不查阅。


    使用 Bash数组

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

    使用 tr

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

    请注意,此替换将留下前导空格,因为单词在逗号后面有空格。

    你可以通过重新处理输出以摆脱前导空格来解决这个问题 或者预处理字符串以在逗号后面压缩空格


答案 1 :(得分:2)

我会要求您使用 awk !!

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

这应该给予

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

答案 2 :(得分: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

答案 3 :(得分:1)

This should work:

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'

Regards.

答案 4 :(得分:0)

您也可以使用剪切 awk

example显示了如何使用它们。

答案 5 :(得分:0)

您可以使用tr命令

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

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

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

答案 6 :(得分: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";