我有一个这样的字符串:
austria rome italy venice london
我想从上面的字符串中删除某些字符串:
rome venice
应该会产生austria italy london
。
我找到了sed但无法让它工作,也尝试过:
diff <(echo "string1") <(echo "string2") | grep "^<" | cut -c3-
但它也不会产生所需的输出。
答案 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;。