从字符串中删除与模式匹配的所有单词

从字符串中删除与模式匹配的所有单词

我有一个像这样的字符串

/usr/bin/gjs /usr/bin/com.github.johnfactotum.Foliate /media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub

在这里,我想删除所有包含 的单词/usr/bin/。我所说的单词是指空格分隔的。

因此,/usr/bin/gjs/usr/bin/com.github.johnfactotum.Foliate将被删除。

结果输出将是/media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub

到目前为止我尝试过的是:

MY_COMMAND_PATH="/usr/bin/gjs /usr/bin/com.github.johnfactotum.Foliate /media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub"

WORD_TO_REMOVE="/usr/bin/gjs "

if [[ $MY_COMMAND_PATH == "/usr/bin/gjs "* ]]; then
    MY_COMMAND_PATH=${MY_COMMAND_PATH//$WORD_TO_REMOVE/}
fi

WORD_TO_REMOVE="/usr/bin/com.github.johnfactotum.Foliate "

if [[ $MY_COMMAND_PATH == "/usr/bin/gjs "* ]]; then
    MY_COMMAND_PATH=${MY_COMMAND_PATH//$WORD_TO_REMOVE/}
fi

但这是不可扩展的。像删除前两个单词这样的解决方案对我来说也不起作用(这是一个示例,并且存在边缘情况)。我需要的确切逻辑是“删除所有单词是包含/usr/bin/”的句子

答案1

您可以使用简单的 perl 命令来完成此操作:

$ string="/usr/bin/gjs /usr/bin/com.github.johnfactotum.Foliate /media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub"
$ printf -- '%s\n' "$string" | perl -pe 's|\S*/usr/bin/\S*\s*||g'
/media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub

\S或者甚至使用能够理解and \s(分别表示“非空白”和“空白”字符)的sed :

$ printf -- '%s\n' "$string" | sed -E 's|\S*/usr/bin/\S*\s*||g'
/media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub

甚至还有一个没有:

$ printf -- '%s\n' "$string" | /sed 's|[^[:blank:]]*/usr/bin/[^[:blank:]]*[[:blank:]]*||g'
/media/ismail/SSDWorking/book-collection/_Books/_misc/100 Things.epub

相关内容