我有一些逗号分隔的字符串,并希望在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字符。
答案 0 :(得分:3)
我认为可以通过两种方式解决问题。
read
和 bash数组 ,
)替换逗号(\n
)。使用 tr
。 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";