我有一个像这样的字符串
/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