从Bash中的另一个变量中删除字符串匹配

时间:2018-03-30 13:09:36

标签: bash

我有一个这样的字符串:

austria rome italy venice london

我想从上面的字符串中删除某些字符串:

rome venice

应该会产生austria italy london

我找到了sed但无法让它工作,也尝试过:

diff <(echo "string1") <(echo "string2") | grep "^<" | cut -c3-

但它也不会产生所需的输出。

3 个答案:

答案 0 :(得分:2)

使用sed扩展正则表达式删除所有不需要的单词:

$ places='austria rome italy venice london'
$ echo $places|sed -E 's/austria|italy|london//g'
 rome  venice

其中:

  • -E是扩展正则表达式,通过 OR 匹配多个单词 (|)运营商
  • g匹配找到的字
  • 所有个实例

<强>更新: 上一个答案留下了可以通过以下方式删除的前导空格:

$ echo $places|sed -E 's/austria|italy|london//g'|sed 's/^[ ]*//'
rome  venice

正如Kristianmitk指出的那样,被移除的单词的前导和结尾空格创建的双重空格可以被单个空格替换:

$ echo $places|sed -E 's/austria|italy|london//g'|sed 's/^[ ]*//;s/  / /g'
rome venice

或者,您可以删除不需要的单词后面的所有尾随空格:

$ echo $places|sed -E 's/austria *|italy *|london *//g'
rome venice

答案 1 :(得分:1)

使用sed简单的单行:

echo "austria rome italy venice london" | sed 's/rome//g;s/venice//g;s/  / /g'

答案 2 :(得分:0)

您可以将单行字符串转换为每行一个单词,使用grep -v,然后使用paste -s转换回单行字符串。为了避免单词拆分问题,我们首先将单词读入数组:

$ str1='austria rome italy venice london'
$ str2='rome venice'
$ read -a arr1 <<< "$str1"
$ read -a arr2 <<< "$str2"
$ printf '%s\n' "${arr1[@]}" | grep -vf <(printf '%s\n' "${arr2[@]}") | paste -sd ' '
austria italy london

或者,您可以使用tr

tr ' ' '\n' <<< "$str1" | grep -vf <(tr ' ' '\n' <<< "$str2") | paste -sd ' '

请注意,在分配给字符串之后,这解决了一般问题&#34;从一个单词列表中删除另一个单词列表中包含的所有单词&#34;。