检查字符串元素是否存在于另一个字符串中

时间:2015-02-26 16:05:12

标签: shell ash

我有两个字符串:

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

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

没有for循环可以做到吗?

1 个答案:

答案 0 :(得分:1)

你可以这样做:

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

comm比较行并输出第一个输入唯一的行,第二个输入是唯一的,两者都是通用的。 -23选项会抑制后两组输出,因此它只会报告第一个输入所独有的行。

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

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

DEMO

如果您没有流程替代,您可以使用命名管道模拟它:

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