我有两个字符串:
l1='a1 a2 b1 b2 c1 c2'
l2='a1 b3 c1'
我想检查字符串的每个元素是否l2
存在于 中l1
,然后将其从l1
.
是否可以在没有for
循环的情况下做到这一点?
你可以这样做:
l1=$(comm -23 <(echo "$l1" | tr ' ' '\n' | sort) <(echo "$l2" | tr ' ' '\n' | sort) | tr '\n' ' ')
comm
比较行并输出对第一个输入唯一、对第二个输入唯一且两者共有的行。该-23
选项抑制后两组输出,因此它只报告第一个输入所特有的行。
由于它需要对输入进行排序,因此我首先将变量传递tr
给以将每个单词放在自己的行上,然后sort
对其进行排序。<(...)
是一个常见的 shell 扩展,称为进程替换,它允许在需要文件名的地方使用命令;例如,它在bash
andzsh
中可用(请参阅此处的表格,其中列出了哪些 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