我有两个变量如下:
sentence="name string,age int,address string,dob timestamp,job string"
ignore="age int,dob timestamp"
基本上我需要遍历逗号分隔变量$ignore
并从上面的变量$sentence
中删除每个单词。
执行此操作后,输出句子应如下所示:
echo $outputsentence
name string,address string,job string
我应该为要忽略的单词创建一个数组并迭代它,执行一个sed操作吗?还有其他方法吗?
答案 0 :(得分:1)
这是一种需要集合的情况:您想知道集合B中不存在集合A的哪些成员。
为此我们有一篇精美的文章Set Operations in the Unix Shell来描述所有这些文章。
如果要检查集合的交集,请说:
$ comm -12 <(tr ',' '\n' <<< "$sentence" | sort) <(tr ',' '\n' <<< "$ignore" | sort)
age int
dob timestamp
如需补充,请使用comm -23
:
$ comm -23 <(tr ',' '\n' <<< "$sentence" | sort) <(tr ',' '\n' <<< "$ignore" | sort)
address string
job string
name string
注意tr ',' '\n' <<< "$var" | sort
只需将,
分隔的字符串拆分为切片。然后,<( )
是process substitution。
答案 1 :(得分:1)
使用GNU sed:
pattern=$(sed "s/,/|/g" <<< "$ignore")
outputsentence=$(sed -r 's/('"$pattern"'),*//g' <<< "$sentence")
第一个sed命令用忽略列表中的交替运算符,
替换所有|
。
此结果用作从$sentence
中删除字符串的模式。