0

我有两个字符串:

l1='a1 a2 b1 b2 c1 c2'
l2='a1 b3 c1'

我想检查字符串的每个元素是否l2存在于 中l1,然后将其从l1.

是否可以在没有for循环的情况下做到这一点?

4

1 回答 1

1

你可以这样做:

l1=$(comm -23 <(echo "$l1" | tr ' ' '\n' | sort) <(echo "$l2" | tr ' ' '\n' | sort) | tr '\n' ' ')

comm比较行并输出对第一个输入唯一、对第二个输入唯一且两者共有的行。该-23选项抑制后两组输出,因此它只报告第一个输入所特有的行。

由于它需要对输入进行排序,因此我首先将变量传递tr给以将每个单词放在自己的行上,然后sort对其进行排序。<(...)是一个常见的 shell 扩展,称为进程替换,它允许在需要文件名的地方使用命令;例如,它在bashandzsh中可用(请参阅此处的表格,其中列出了哪些 shell 拥有它)。

最后,我tr再次使用将换行符转换回空格。

演示

如果你没有进程替代,你可以用命名管道来模拟它:

mkfifo p1
echo "$l1" | tr ' ' '\n' | sort > p1 &
mkfifo p2
echo "$l2" | tr ' ' '\n' | sort > p2 &
l1=$(comm p1 p2 | tr '\n' ' ')
rm p1 p2
于 2015-02-26T16:23:30.257 回答