首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Bash中的另一个变量中删除字符串匹配

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

Stack Overflow用户
提问于 2018-03-30 13:09:36
回答 3查看 504关注 0票数 2

我有一根这样的绳子:

代码语言:javascript
运行
复制
austria rome italy venice london

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

代码语言:javascript
运行
复制
rome venice

这应该会导致austria italy london

我找到了sed,但没能让它起作用,我也试过:

代码语言:javascript
运行
复制
diff <(echo "string1") <(echo "string2") | grep "^<" | cut -c3-

但它也不能产生期望的输出。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-30 13:35:02

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

代码语言:javascript
运行
复制
$ places='austria rome italy venice london'
$ echo $places|sed -E 's/austria|italy|london//g'
 rome  venice

其中:

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

Update:先前的答案留下了可以通过以下方式删除的前导空格:

代码语言:javascript
运行
复制
$ echo $places|sed -E 's/austria|italy|london//g'|sed 's/^[ ]*//'
rome  venice

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

代码语言:javascript
运行
复制
$ echo $places|sed -E 's/austria|italy|london//g'|sed 's/^[ ]*//;s/  / /g'
rome venice

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

代码语言:javascript
运行
复制
$ echo $places|sed -E 's/austria *|italy *|london *//g'
rome venice
票数 3
EN

Stack Overflow用户

发布于 2018-03-30 13:27:27

对于sed,一个简单的一行程序:

代码语言:javascript
运行
复制
echo "austria rome italy venice london" | sed 's/rome//g;s/venice//g;s/  / /g'
票数 1
EN

Stack Overflow用户

发布于 2018-03-30 13:21:17

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

代码语言:javascript
运行
复制
$ 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

代码语言:javascript
运行
复制
tr ' ' '\n' <<< "$str1" | grep -vf <(tr ' ' '\n' <<< "$str2") | paste -sd ' '

注意,在为字符串赋值之后,这解决了“从一个单词列表中删除另一个单词列表中包含的所有单词”的一般问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49575095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档