我有一根这样的绳子:
austria rome italy venice london我想从上面的字符串中删除某些字符串:
rome venice这应该会导致austria italy london。
我找到了sed,但没能让它起作用,我也试过:
diff <(echo "string1") <(echo "string2") | grep "^<" | cut -c3-但它也不能产生期望的输出。
发布于 2018-03-30 13:35:02
使用sed和扩展正则表达式删除所有不想要的单词:
$ places='austria rome italy venice london'
$ echo $places|sed -E 's/austria|italy|london//g'
 rome  venice其中:
-E是扩展正则表达式,通过或 (|)运算符匹配多个单词。g匹配找到的单词的所有实例Update:先前的答案留下了可以通过以下方式删除的前导空格:
$ 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发布于 2018-03-30 13:27:27
对于sed,一个简单的一行程序:
echo "austria rome italy venice london" | sed 's/rome//g;s/venice//g;s/  / /g'发布于 2018-03-30 13:21:17
您可以将单行字符串转换为一行字,使用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 ' '注意,在为字符串赋值之后,这解决了“从一个单词列表中删除另一个单词列表中包含的所有单词”的一般问题。
https://stackoverflow.com/questions/49575095
复制相似问题