我有两个字符串:
l1='a1 a2 b1 b2 c1 c2'
l2='a1 b3 c1'
我想检查l2
中是否存在字符串l1
的每个元素,然后将其从l1
中删除。
没有for
循环可以做到吗?
答案 0 :(得分:1)
你可以这样做:
l1=$(comm -23 <(echo "$l1" | tr ' ' '\n' | sort) <(echo "$l2" | tr ' ' '\n' | sort) | tr '\n' ' ')
comm
比较行并输出第一个输入唯一的行,第二个输入是唯一的,两者都是通用的。 -23
选项会抑制后两组输出,因此它只会报告第一个输入所独有的行。
由于它需要对输入进行排序,我首先将变量传递给tr
以将每个单词放在它自己的行上,然后sort
对它进行排序。 <(...)
是一个名为process substitution的常见shell扩展,它允许在需要文件名的地方使用命令;例如,它可以在bash
和zsh
中使用(有关列出哪些shell的表,请参阅here。)
最后,我再次使用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