私はこのような文字列を持っています
/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
しかし、これは拡張可能ではありません。最初の2つの単語を削除するのと同じ解決策は私にとっても効果がありませんでした(これは例であり、極端な場合があります)。私に必要な正確なロジックは、「/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
または、\s
and(それぞれ「空白ではない」文字と「空白」文字を意味します)を理解する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